< prev index next >

src/share/vm/memory/referenceProcessor.cpp

Print this page




1183   HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj);
1184   const oop  discovered = java_lang_ref_Reference::discovered(obj);
1185   assert(discovered->is_oop_or_null(), "bad discovered field");
1186   if (discovered != NULL) {
1187     // The reference has already been discovered...
1188     if (TraceReferenceGC) {
1189       gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
1190                              (void *)obj, obj->klass()->internal_name());
1191     }
1192     if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1193       // assumes that an object is not processed twice;
1194       // if it's been already discovered it must be on another
1195       // generation's discovered list; so we won't discover it.
1196       return false;
1197     } else {
1198       assert(RefDiscoveryPolicy == ReferenceBasedDiscovery,
1199              "Unrecognized policy");
1200       // Check assumption that an object is not potentially
1201       // discovered twice except by concurrent collectors that potentially
1202       // trace the same Reference object twice.
1203       assert(UseConcMarkSweepGC || UseG1GC,
1204              "Only possible with a concurrent marking collector");
1205       return true;
1206     }
1207   }
1208 
1209   if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1210     verify_referent(obj);
1211     // Discover if and only if EITHER:
1212     // .. reference is in our span, OR
1213     // .. we are an atomic collector and referent is in our span
1214     if (_span.contains(obj_addr) ||
1215         (discovery_is_atomic() &&
1216          _span.contains(java_lang_ref_Reference::referent(obj)))) {
1217       // should_enqueue = true;
1218     } else {
1219       return false;
1220     }
1221   } else {
1222     assert(RefDiscoveryPolicy == ReferenceBasedDiscovery &&
1223            _span.contains(obj_addr), "code inconsistency");




1183   HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj);
1184   const oop  discovered = java_lang_ref_Reference::discovered(obj);
1185   assert(discovered->is_oop_or_null(), "bad discovered field");
1186   if (discovered != NULL) {
1187     // The reference has already been discovered...
1188     if (TraceReferenceGC) {
1189       gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
1190                              (void *)obj, obj->klass()->internal_name());
1191     }
1192     if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1193       // assumes that an object is not processed twice;
1194       // if it's been already discovered it must be on another
1195       // generation's discovered list; so we won't discover it.
1196       return false;
1197     } else {
1198       assert(RefDiscoveryPolicy == ReferenceBasedDiscovery,
1199              "Unrecognized policy");
1200       // Check assumption that an object is not potentially
1201       // discovered twice except by concurrent collectors that potentially
1202       // trace the same Reference object twice.
1203       assert(UseConcMarkSweepGC || UseG1GC || UseShenandoahGC,
1204              "Only possible with a concurrent marking collector");
1205       return true;
1206     }
1207   }
1208 
1209   if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1210     verify_referent(obj);
1211     // Discover if and only if EITHER:
1212     // .. reference is in our span, OR
1213     // .. we are an atomic collector and referent is in our span
1214     if (_span.contains(obj_addr) ||
1215         (discovery_is_atomic() &&
1216          _span.contains(java_lang_ref_Reference::referent(obj)))) {
1217       // should_enqueue = true;
1218     } else {
1219       return false;
1220     }
1221   } else {
1222     assert(RefDiscoveryPolicy == ReferenceBasedDiscovery &&
1223            _span.contains(obj_addr), "code inconsistency");


< prev index next >