mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-16 00:54:38 +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() { }
|
||||
|
||||
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 {
|
||||
|
@ -189,8 +190,6 @@ public:
|
|||
_from = from;
|
||||
}
|
||||
|
||||
bool apply_to_weak_ref_discovered_field() { return true; }
|
||||
|
||||
bool self_forwarded(oop obj) {
|
||||
markOop m = obj->mark();
|
||||
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);
|
||||
virtual inline void do_oop(narrowOop* 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
|
||||
|
|
|
@ -68,8 +68,9 @@ class ExtendedOopClosure : public OopClosure {
|
|||
// Iteration of InstanceRefKlasses differ depending on the closure,
|
||||
// the below enum describes the different alternatives.
|
||||
enum ReferenceIterationMode {
|
||||
DO_DISCOVERY, // Apply closure and discover references
|
||||
DO_FIELDS // Apply closure to all fields
|
||||
DO_DISCOVERY, // Apply closure and discover references
|
||||
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.
|
||||
|
@ -102,7 +103,6 @@ class ExtendedOopClosure : public OopClosure {
|
|||
// 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).
|
||||
virtual bool idempotent() { return false; }
|
||||
virtual bool apply_to_weak_ref_discovered_field() { return false; }
|
||||
|
||||
#ifdef ASSERT
|
||||
// Default verification of each visited oop field.
|
||||
|
|
|
@ -123,6 +123,12 @@ private:
|
|||
template <bool nv, typename T, class OopClosureType, class 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.
|
||||
template <bool nv, typename T, class OopClosureType, class 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) {
|
||||
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.
|
||||
if (try_discover<T>(obj, type, closure)) {
|
||||
return;
|
||||
|
@ -115,12 +110,23 @@ void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure,
|
|||
(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>
|
||||
void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) {
|
||||
switch (closure->reference_iteration_mode()) {
|
||||
case ExtendedOopClosure::DO_DISCOVERY:
|
||||
oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains);
|
||||
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:
|
||||
oop_oop_iterate_fields<nv, T>(obj, closure, contains);
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue