diff --git a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp index 9eebfbd6a86..50b3ab203d7 100644 --- a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp +++ b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp @@ -227,8 +227,8 @@ void G1ParCopyClosure::do_oop_work(T* p) { if (state.is_in_cset()) { oop forwardee; markWord m = obj->mark(); - if (m.is_marked()) { - forwardee = cast_to_oop(m.decode_pointer()); + if (m.is_forwarded()) { + forwardee = m.forwardee(); } else { forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m); } diff --git a/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp b/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp index 81169f89a07..c495889faad 100644 --- a/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp +++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp @@ -211,8 +211,8 @@ void G1ParScanThreadState::do_oop_evac(T* p) { } markWord m = obj->mark(); - if (m.is_marked()) { - obj = cast_to_oop(m.decode_pointer()); + if (m.is_forwarded()) { + obj = m.forwardee(); } else { obj = do_copy_to_survivor_space(region_attr, obj, m); } diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp index 730d31893d5..eb27e9776ed 100644 --- a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp +++ b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp @@ -145,7 +145,7 @@ inline oop PSPromotionManager::copy_to_survivor_space(oop o) { // in o. There may be multiple threads racing on it, and it may be forwarded // at any time. markWord m = o->mark(); - if (!m.is_marked()) { + if (!m.is_forwarded()) { return copy_unmarked_to_survivor_space(o, m); } else { // Ensure any loads from the forwardee follow all changes that precede @@ -153,7 +153,7 @@ inline oop PSPromotionManager::copy_to_survivor_space(oop o) { // other thread. OrderAccess::acquire(); // Return the already installed forwardee. - return cast_to_oop(m.decode_pointer()); + return m.forwardee(); } } diff --git a/src/hotspot/share/gc/shared/preservedMarks.inline.hpp b/src/hotspot/share/gc/shared/preservedMarks.inline.hpp index aa181b408ae..fc732fee534 100644 --- a/src/hotspot/share/gc/shared/preservedMarks.inline.hpp +++ b/src/hotspot/share/gc/shared/preservedMarks.inline.hpp @@ -43,7 +43,7 @@ inline void PreservedMarks::push_if_necessary(oop obj, markWord m) { } inline void PreservedMarks::push_always(oop obj, markWord m) { - assert(!m.is_marked(), "precondition"); + assert(!m.is_forwarded(), "precondition"); PreservedMark elem(obj, m); _stack.push(elem); } diff --git a/src/hotspot/share/oops/markWord.hpp b/src/hotspot/share/oops/markWord.hpp index ba89f947dcf..12d6ee73acf 100644 --- a/src/hotspot/share/oops/markWord.hpp +++ b/src/hotspot/share/oops/markWord.hpp @@ -143,6 +143,9 @@ class markWord { bool is_marked() const { return (mask_bits(value(), lock_mask_in_place) == marked_value); } + bool is_forwarded() const { + return (mask_bits(value(), lock_mask_in_place) == marked_value); + } bool is_neutral() const { // Not locked, or marked - a "clean" neutral state return (mask_bits(value(), lock_mask_in_place) == unlocked_value); } @@ -225,7 +228,7 @@ class markWord { } // used to encode pointers during GC - markWord clear_lock_bits() { return markWord(value() & ~lock_mask_in_place); } + markWord clear_lock_bits() const { return markWord(value() & ~lock_mask_in_place); } // age operations markWord set_marked() { return markWord((value() & ~lock_mask_in_place) | marked_value); } @@ -259,7 +262,11 @@ class markWord { inline static markWord encode_pointer_as_mark(void* p) { return from_pointer(p).set_marked(); } // Recover address of oop from encoded form used in mark - inline void* decode_pointer() { return (void*)clear_lock_bits().value(); } + inline void* decode_pointer() const { return (void*)clear_lock_bits().value(); } + + inline oop forwardee() const { + return cast_to_oop(decode_pointer()); + } }; // Support atomic operations. diff --git a/src/hotspot/share/oops/oop.inline.hpp b/src/hotspot/share/oops/oop.inline.hpp index bd00847869d..b7dbc7b2224 100644 --- a/src/hotspot/share/oops/oop.inline.hpp +++ b/src/hotspot/share/oops/oop.inline.hpp @@ -262,9 +262,7 @@ bool oopDesc::is_gc_marked() const { // Used by scavengers bool oopDesc::is_forwarded() const { - // The extra heap check is needed since the obj might be locked, in which case the - // mark would point to a stack location and have the sentinel bit cleared - return mark().is_marked(); + return mark().is_forwarded(); } // Used by scavengers @@ -289,8 +287,7 @@ oop oopDesc::forward_to_atomic(oop p, markWord compare, atomic_memory_order orde // The forwardee is used when copying during scavenge and mark-sweep. // It does need to clear the low two locking- and GC-related bits. oop oopDesc::forwardee() const { - assert(is_forwarded(), "only decode when actually forwarded"); - return cast_to_oop(mark().decode_pointer()); + return mark().forwardee(); } // The following method needs to be MT safe.