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");
|