8330585: Refactor/rename forwardee handling

Reviewed-by: stefank, ayang
This commit is contained in:
Roman Kennke 2024-04-22 15:03:09 +00:00
parent 3e65d90b4d
commit 7e421ce9d0
6 changed files with 18 additions and 14 deletions

@ -227,8 +227,8 @@ void G1ParCopyClosure<barrier, should_mark>::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);
}

@ -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);
}

@ -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<promote_immediately>(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();
}
}

@ -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);
}

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

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