8330585: Refactor/rename forwardee handling
Reviewed-by: stefank, ayang
This commit is contained in:
parent
3e65d90b4d
commit
7e421ce9d0
src/hotspot/share
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user