void GarbageCollector::processReference(Object *slot) { size_t size = SizeOfObject(*slot); if (size <= 0) return; Object obj = *slot; if (obj == 0) return; if (from_space_->contains(obj)) { if (!isForwarded(obj)) { Object new_obj = swap(obj, size); forwardTo(obj, new_obj); *slot = new_obj; } else { *slot = forwardee(obj); } } }
inline oop oopDesc::forward_to_atomic(oop p) { assert(ParNewGeneration::is_legal_forward_ptr(p), "illegal forwarding pointer value."); 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(); }