< prev index next >
src/share/vm/oops/oop.inline.hpp
Print this page
*** 628,637 ****
--- 628,661 ----
markOop m = markOopDesc::encode_pointer_as_mark(p);
assert(m->decode_pointer() == p, "encoding must be reversable");
return cas_set_mark(m, compare) == compare;
}
+ #if INCLUDE_ALL_GCS
+ inline oop oopDesc::forward_to_atomic(oop p) {
+ markOop oldMark = mark();
+ 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 = (markOop)Atomic::cmpxchg_ptr(forwardPtrMark, &_mark, oldMark);
+ 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();
+ }
+ #endif
+
// 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.
inline oop oopDesc::forwardee() const {
return (oop) mark()->decode_pointer();
< prev index next >