334 } 335 336 // Used only for markSweep, scavenging 337 bool oopDesc::is_gc_marked() const { 338 return mark_raw()->is_marked(); 339 } 340 341 // Used by scavengers 342 bool oopDesc::is_forwarded() const { 343 // The extra heap check is needed since the obj might be locked, in which case the 344 // mark would point to a stack location and have the sentinel bit cleared 345 return mark_raw()->is_marked(); 346 } 347 348 // Used by scavengers 349 void oopDesc::forward_to(oop p) { 350 assert(check_obj_alignment(p), 351 "forwarding to something not aligned"); 352 assert(Universe::heap()->is_in_reserved(p), 353 "forwarding to something not in heap"); 354 assert(!is_archive_object(oop(this)) && 355 !is_archive_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); | 334 } 335 336 // Used only for markSweep, scavenging 337 bool oopDesc::is_gc_marked() const { 338 return mark_raw()->is_marked(); 339 } 340 341 // Used by scavengers 342 bool oopDesc::is_forwarded() const { 343 // The extra heap check is needed since the obj might be locked, in which case the 344 // mark would point to a stack location and have the sentinel bit cleared 345 return mark_raw()->is_marked(); 346 } 347 348 // Used by scavengers 349 void oopDesc::forward_to(oop p) { 350 assert(check_obj_alignment(p), 351 "forwarding to something not aligned"); 352 assert(Universe::heap()->is_in_reserved(p), 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); |