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