mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-16 17:14:41 +02:00
8138888: Remove ExtendedOopClosure::apply_to_weak_ref_discovered_field
Reviewed-by: kbarrett, tschatzl
This commit is contained in:
parent
eb6d311b66
commit
50ded710fd
4 changed files with 25 additions and 11 deletions
|
@ -56,7 +56,8 @@ protected:
|
||||||
~G1ParClosureSuper() { }
|
~G1ParClosureSuper() { }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool apply_to_weak_ref_discovered_field() { return true; }
|
// This closure needs special handling for InstanceRefKlass.
|
||||||
|
virtual ReferenceIterationMode reference_iteration_mode() { return DO_DISCOVERED_AND_DISCOVERY; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class G1ParPushHeapRSClosure : public G1ParClosureSuper {
|
class G1ParPushHeapRSClosure : public G1ParClosureSuper {
|
||||||
|
@ -189,8 +190,6 @@ public:
|
||||||
_from = from;
|
_from = from;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool apply_to_weak_ref_discovered_field() { return true; }
|
|
||||||
|
|
||||||
bool self_forwarded(oop obj) {
|
bool self_forwarded(oop obj) {
|
||||||
markOop m = obj->mark();
|
markOop m = obj->mark();
|
||||||
bool result = (m->is_marked() && ((oop)m->decode_pointer() == obj));
|
bool result = (m->is_marked() && ((oop)m->decode_pointer() == obj));
|
||||||
|
@ -202,6 +201,9 @@ public:
|
||||||
template <class T> inline void do_oop_nv(T* p);
|
template <class T> inline void do_oop_nv(T* p);
|
||||||
virtual inline void do_oop(narrowOop* p);
|
virtual inline void do_oop(narrowOop* p);
|
||||||
virtual inline void do_oop(oop* p);
|
virtual inline void do_oop(oop* p);
|
||||||
|
|
||||||
|
// This closure needs special handling for InstanceRefKlass.
|
||||||
|
virtual ReferenceIterationMode reference_iteration_mode() { return DO_DISCOVERED_AND_DISCOVERY; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SHARE_VM_GC_G1_G1OOPCLOSURES_HPP
|
#endif // SHARE_VM_GC_G1_G1OOPCLOSURES_HPP
|
||||||
|
|
|
@ -68,8 +68,9 @@ class ExtendedOopClosure : public OopClosure {
|
||||||
// Iteration of InstanceRefKlasses differ depending on the closure,
|
// Iteration of InstanceRefKlasses differ depending on the closure,
|
||||||
// the below enum describes the different alternatives.
|
// the below enum describes the different alternatives.
|
||||||
enum ReferenceIterationMode {
|
enum ReferenceIterationMode {
|
||||||
DO_DISCOVERY, // Apply closure and discover references
|
DO_DISCOVERY, // Apply closure and discover references
|
||||||
DO_FIELDS // Apply closure to all fields
|
DO_DISCOVERED_AND_DISCOVERY, // Apply closure to discovered field and do discovery
|
||||||
|
DO_FIELDS // Apply closure to all fields
|
||||||
};
|
};
|
||||||
|
|
||||||
// The default iteration mode is to do discovery.
|
// The default iteration mode is to do discovery.
|
||||||
|
@ -102,7 +103,6 @@ class ExtendedOopClosure : public OopClosure {
|
||||||
// True iff this closure may be safely applied more than once to an oop
|
// True iff this closure may be safely applied more than once to an oop
|
||||||
// location without an intervening "major reset" (like the end of a GC).
|
// location without an intervening "major reset" (like the end of a GC).
|
||||||
virtual bool idempotent() { return false; }
|
virtual bool idempotent() { return false; }
|
||||||
virtual bool apply_to_weak_ref_discovered_field() { return false; }
|
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
// Default verification of each visited oop field.
|
// Default verification of each visited oop field.
|
||||||
|
|
|
@ -123,6 +123,12 @@ private:
|
||||||
template <bool nv, typename T, class OopClosureType, class Contains>
|
template <bool nv, typename T, class OopClosureType, class Contains>
|
||||||
static void oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains);
|
static void oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains);
|
||||||
|
|
||||||
|
// Used for a special case in G1 where the closure needs to be applied
|
||||||
|
// to the discovered field. Reference discovery is also done if the
|
||||||
|
// closure provides a ReferenceProcessor.
|
||||||
|
template <bool nv, typename T, class OopClosureType, class Contains>
|
||||||
|
static void oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains);
|
||||||
|
|
||||||
// Apply the closure to all fields. No reference discovery is done.
|
// Apply the closure to all fields. No reference discovery is done.
|
||||||
template <bool nv, typename T, class OopClosureType, class Contains>
|
template <bool nv, typename T, class OopClosureType, class Contains>
|
||||||
static void oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains);
|
static void oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains);
|
||||||
|
|
|
@ -79,11 +79,6 @@ template <bool nv, typename T, class OopClosureType, class Contains>
|
||||||
void InstanceRefKlass::oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
|
void InstanceRefKlass::oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
|
||||||
log_develop_trace(gc, ref)("Process reference with discovery " PTR_FORMAT, p2i(obj));
|
log_develop_trace(gc, ref)("Process reference with discovery " PTR_FORMAT, p2i(obj));
|
||||||
|
|
||||||
// Special case for some closures.
|
|
||||||
if (closure->apply_to_weak_ref_discovered_field()) {
|
|
||||||
do_discovered<nv, T>(obj, closure, contains);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to discover reference and return if it succeeds.
|
// Try to discover reference and return if it succeeds.
|
||||||
if (try_discover<T>(obj, type, closure)) {
|
if (try_discover<T>(obj, type, closure)) {
|
||||||
return;
|
return;
|
||||||
|
@ -115,12 +110,23 @@ void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure,
|
||||||
(T*)java_lang_ref_Reference::discovered_addr(obj));
|
(T*)java_lang_ref_Reference::discovered_addr(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <bool nv, typename T, class OopClosureType, class Contains>
|
||||||
|
void InstanceRefKlass::oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
|
||||||
|
// Explicitly apply closure to the discovered field.
|
||||||
|
do_discovered<nv, T>(obj, closure, contains);
|
||||||
|
// Then do normal reference processing with discovery.
|
||||||
|
oop_oop_iterate_discovery<nv, T>(obj, type, closure, contains);
|
||||||
|
}
|
||||||
|
|
||||||
template <bool nv, typename T, class OopClosureType, class Contains>
|
template <bool nv, typename T, class OopClosureType, class Contains>
|
||||||
void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
|
void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
|
||||||
switch (closure->reference_iteration_mode()) {
|
switch (closure->reference_iteration_mode()) {
|
||||||
case ExtendedOopClosure::DO_DISCOVERY:
|
case ExtendedOopClosure::DO_DISCOVERY:
|
||||||
oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains);
|
oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains);
|
||||||
break;
|
break;
|
||||||
|
case ExtendedOopClosure::DO_DISCOVERED_AND_DISCOVERY:
|
||||||
|
oop_oop_iterate_discovered_and_discovery<nv, T>(obj, reference_type(), closure, contains);
|
||||||
|
break;
|
||||||
case ExtendedOopClosure::DO_FIELDS:
|
case ExtendedOopClosure::DO_FIELDS:
|
||||||
oop_oop_iterate_fields<nv, T>(obj, closure, contains);
|
oop_oop_iterate_fields<nv, T>(obj, closure, contains);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue