< 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 >