< prev index next >

src/hotspot/share/gc/shared/referenceProcessor.cpp

Print this page
rev 53307 : Backport Shenadoah GC


1139   ResourceMark rm;      // Needed for tracing.
1140 
1141   HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr_raw(obj);
1142   const oop  discovered = java_lang_ref_Reference::discovered(obj);
1143   assert(oopDesc::is_oop_or_null(discovered), "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
1144   if (discovered != NULL) {
1145     // The reference has already been discovered...
1146     log_develop_trace(gc, ref)("Already discovered reference (" INTPTR_FORMAT ": %s)",
1147                                p2i(obj), obj->klass()->internal_name());
1148     if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1149       // assumes that an object is not processed twice;
1150       // if it's been already discovered it must be on another
1151       // generation's discovered list; so we won't discover it.
1152       return false;
1153     } else {
1154       assert(RefDiscoveryPolicy == ReferenceBasedDiscovery,
1155              "Unrecognized policy");
1156       // Check assumption that an object is not potentially
1157       // discovered twice except by concurrent collectors that potentially
1158       // trace the same Reference object twice.
1159       assert(UseConcMarkSweepGC || UseG1GC,
1160              "Only possible with a concurrent marking collector");
1161       return true;
1162     }
1163   }
1164 
1165   if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1166     verify_referent(obj);
1167     // Discover if and only if EITHER:
1168     // .. reference is in our span, OR
1169     // .. we are an atomic collector and referent is in our span
1170     if (is_subject_to_discovery(obj) ||
1171         (discovery_is_atomic() &&
1172          is_subject_to_discovery(java_lang_ref_Reference::referent(obj)))) {
1173     } else {
1174       return false;
1175     }
1176   } else {
1177     assert(RefDiscoveryPolicy == ReferenceBasedDiscovery &&
1178            is_subject_to_discovery(obj), "code inconsistency");
1179   }




1139   ResourceMark rm;      // Needed for tracing.
1140 
1141   HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr_raw(obj);
1142   const oop  discovered = java_lang_ref_Reference::discovered(obj);
1143   assert(oopDesc::is_oop_or_null(discovered), "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
1144   if (discovered != NULL) {
1145     // The reference has already been discovered...
1146     log_develop_trace(gc, ref)("Already discovered reference (" INTPTR_FORMAT ": %s)",
1147                                p2i(obj), obj->klass()->internal_name());
1148     if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1149       // assumes that an object is not processed twice;
1150       // if it's been already discovered it must be on another
1151       // generation's discovered list; so we won't discover it.
1152       return false;
1153     } else {
1154       assert(RefDiscoveryPolicy == ReferenceBasedDiscovery,
1155              "Unrecognized policy");
1156       // Check assumption that an object is not potentially
1157       // discovered twice except by concurrent collectors that potentially
1158       // trace the same Reference object twice.
1159       assert(UseConcMarkSweepGC || UseG1GC || UseShenandoahGC,
1160              "Only possible with a concurrent marking collector");
1161       return true;
1162     }
1163   }
1164 
1165   if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1166     verify_referent(obj);
1167     // Discover if and only if EITHER:
1168     // .. reference is in our span, OR
1169     // .. we are an atomic collector and referent is in our span
1170     if (is_subject_to_discovery(obj) ||
1171         (discovery_is_atomic() &&
1172          is_subject_to_discovery(java_lang_ref_Reference::referent(obj)))) {
1173     } else {
1174       return false;
1175     }
1176   } else {
1177     assert(RefDiscoveryPolicy == ReferenceBasedDiscovery &&
1178            is_subject_to_discovery(obj), "code inconsistency");
1179   }


< prev index next >