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