< prev index next >

src/hotspot/share/oops/oop.inline.hpp

Print this page
rev 52211 : [mq]: 8212753-improve-forward-to-atomic


 353          "forwarding to something not in heap");
 354   assert(!is_archived_object(oop(this)) &&
 355          !is_archived_object(p),
 356          "forwarding archive object");
 357   markOop m = markOopDesc::encode_pointer_as_mark(p);
 358   assert(m->decode_pointer() == p, "encoding must be reversable");
 359   set_mark_raw(m);
 360 }
 361 
 362 // Used by parallel scavengers
 363 bool oopDesc::cas_forward_to(oop p, markOop compare, atomic_memory_order order) {
 364   assert(check_obj_alignment(p),
 365          "forwarding to something not aligned");
 366   assert(Universe::heap()->is_in_reserved(p),
 367          "forwarding to something not in heap");
 368   markOop m = markOopDesc::encode_pointer_as_mark(p);
 369   assert(m->decode_pointer() == p, "encoding must be reversable");
 370   return cas_set_mark_raw(m, compare, order) == compare;
 371 }
 372 
 373 oop oopDesc::forward_to_atomic(oop p, atomic_memory_order order) {
 374   markOop oldMark = mark_raw();
 375   markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
 376   markOop curMark;
 377 
 378   assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
 379   assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
 380 
 381   while (!oldMark->is_marked()) {
 382     curMark = cas_set_mark_raw(forwardPtrMark, oldMark, order);
 383     assert(is_forwarded(), "object should have been forwarded");
 384     if (curMark == oldMark) {
 385       return NULL;


 386     }
 387     // If the CAS was unsuccessful then curMark->is_marked()
 388     // should return true as another thread has CAS'd in another
 389     // forwarding pointer.
 390     oldMark = curMark;
 391   }
 392   return forwardee();
 393 }
 394 
 395 // Note that the forwardee is not the same thing as the displaced_mark.
 396 // The forwardee is used when copying during scavenge and mark-sweep.
 397 // It does need to clear the low two locking- and GC-related bits.
 398 oop oopDesc::forwardee() const {
 399   return (oop) mark_raw()->decode_pointer();
 400 }
 401 
 402 // Note that the forwardee is not the same thing as the displaced_mark.
 403 // The forwardee is used when copying during scavenge and mark-sweep.
 404 // It does need to clear the low two locking- and GC-related bits.
 405 oop oopDesc::forwardee_acquire() const {
 406   markOop m = OrderAccess::load_acquire(&_mark);
 407   return (oop) m->decode_pointer();
 408 }
 409 
 410 // The following method needs to be MT safe.
 411 uint oopDesc::age() const {
 412   assert(!is_forwarded(), "Attempt to read age from forwarded mark");




 353          "forwarding to something not in heap");
 354   assert(!is_archived_object(oop(this)) &&
 355          !is_archived_object(p),
 356          "forwarding archive object");
 357   markOop m = markOopDesc::encode_pointer_as_mark(p);
 358   assert(m->decode_pointer() == p, "encoding must be reversable");
 359   set_mark_raw(m);
 360 }
 361 
 362 // Used by parallel scavengers
 363 bool oopDesc::cas_forward_to(oop p, markOop compare, atomic_memory_order order) {
 364   assert(check_obj_alignment(p),
 365          "forwarding to something not aligned");
 366   assert(Universe::heap()->is_in_reserved(p),
 367          "forwarding to something not in heap");
 368   markOop m = markOopDesc::encode_pointer_as_mark(p);
 369   assert(m->decode_pointer() == p, "encoding must be reversable");
 370   return cas_set_mark_raw(m, compare, order) == compare;
 371 }
 372 
 373 oop oopDesc::forward_to_atomic(oop p, markOop compare, atomic_memory_order order) {
 374   assert(UseConcMarkSweepGC || check_obj_alignment(p),
 375          "forwarding to something not aligned");
 376   assert(UseConcMarkSweepGC || Universe::heap()->is_in_reserved(p),
 377          "forwarding to something not in heap");
 378   markOop m = markOopDesc::encode_pointer_as_mark(p);
 379   assert(m->decode_pointer() == p, "encoding must be reversable");
 380   markOop old_mark = cas_set_mark_raw(m, compare, order);
 381   if (old_mark == compare) {



 382     return NULL;
 383   } else {
 384     return (oop)old_mark->decode_pointer();
 385   }






 386 }
 387 
 388 // Note that the forwardee is not the same thing as the displaced_mark.
 389 // The forwardee is used when copying during scavenge and mark-sweep.
 390 // It does need to clear the low two locking- and GC-related bits.
 391 oop oopDesc::forwardee() const {
 392   return (oop) mark_raw()->decode_pointer();
 393 }
 394 
 395 // Note that the forwardee is not the same thing as the displaced_mark.
 396 // The forwardee is used when copying during scavenge and mark-sweep.
 397 // It does need to clear the low two locking- and GC-related bits.
 398 oop oopDesc::forwardee_acquire() const {
 399   markOop m = OrderAccess::load_acquire(&_mark);
 400   return (oop) m->decode_pointer();
 401 }
 402 
 403 // The following method needs to be MT safe.
 404 uint oopDesc::age() const {
 405   assert(!is_forwarded(), "Attempt to read age from forwarded mark");


< prev index next >