8138888: Remove ExtendedOopClosure::apply_to_weak_ref_discovered_field

Reviewed-by: kbarrett, tschatzl
This commit is contained in:
Stefan Johansson 2017-05-09 11:03:45 +02:00
parent eb6d311b66
commit 50ded710fd
4 changed files with 25 additions and 11 deletions

View file

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

View file

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

View file

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

View file

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