< prev index next >
src/hotspot/share/oops/oop.inline.hpp
Print this page
rev 52211 : [mq]: 8212753-improve-forward-to-atomic
*** 368,397 ****
markOop m = markOopDesc::encode_pointer_as_mark(p);
assert(m->decode_pointer() == p, "encoding must be reversable");
return cas_set_mark_raw(m, compare, order) == compare;
}
! oop oopDesc::forward_to_atomic(oop p, atomic_memory_order order) {
! markOop oldMark = mark_raw();
! markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
! markOop curMark;
!
! assert(forwardPtrMark->decode_pointer() == p, "encoding must be reversable");
! assert(sizeof(markOop) == sizeof(intptr_t), "CAS below requires this.");
!
! while (!oldMark->is_marked()) {
! curMark = cas_set_mark_raw(forwardPtrMark, oldMark, order);
! assert(is_forwarded(), "object should have been forwarded");
! if (curMark == oldMark) {
return NULL;
}
- // If the CAS was unsuccessful then curMark->is_marked()
- // should return true as another thread has CAS'd in another
- // forwarding pointer.
- oldMark = curMark;
- }
- return forwardee();
}
// Note that the forwardee is not the same thing as the displaced_mark.
// The forwardee is used when copying during scavenge and mark-sweep.
// It does need to clear the low two locking- and GC-related bits.
--- 368,390 ----
markOop m = markOopDesc::encode_pointer_as_mark(p);
assert(m->decode_pointer() == p, "encoding must be reversable");
return cas_set_mark_raw(m, compare, order) == compare;
}
! oop oopDesc::forward_to_atomic(oop p, markOop compare, atomic_memory_order order) {
! assert(UseConcMarkSweepGC || check_obj_alignment(p),
! "forwarding to something not aligned");
! assert(UseConcMarkSweepGC || Universe::heap()->is_in_reserved(p),
! "forwarding to something not in heap");
! markOop m = markOopDesc::encode_pointer_as_mark(p);
! assert(m->decode_pointer() == p, "encoding must be reversable");
! markOop old_mark = cas_set_mark_raw(m, compare, order);
! if (old_mark == compare) {
return NULL;
+ } else {
+ return (oop)old_mark->decode_pointer();
}
}
// Note that the forwardee is not the same thing as the displaced_mark.
// The forwardee is used when copying during scavenge and mark-sweep.
// It does need to clear the low two locking- and GC-related bits.
< prev index next >