1073 add_to_discovered_list_mt(*list, obj, discovered_addr);
1074 } else {
1075 // We do a raw store here: the field will be visited later when processing
1076 // the discovered references.
1077 oop current_head = list->head();
1078 // The last ref must have its discovered field pointing to itself.
1079 oop next_discovered = (current_head != NULL) ? current_head : obj;
1080
1081 assert(discovered == NULL, "control point invariant");
1082 oop_store_raw(discovered_addr, next_discovered);
1083 list->set_head(obj);
1084 list->inc_length(1);
1085
1086 log_develop_trace(gc, ref)("Discovered reference (" INTPTR_FORMAT ": %s)", p2i(obj), obj->klass()->internal_name());
1087 }
1088 assert(obj->is_oop(), "Discovered a bad reference");
1089 verify_referent(obj);
1090 return true;
1091 }
1092
1093 // Preclean the discovered references by removing those
1094 // whose referents are alive, and by marking from those that
1095 // are not active. These lists can be handled here
1096 // in any order and, indeed, concurrently.
1097 void ReferenceProcessor::preclean_discovered_references(
1098 BoolObjectClosure* is_alive,
1099 OopClosure* keep_alive,
1100 VoidClosure* complete_gc,
1101 YieldClosure* yield,
1102 GCTimer* gc_timer) {
1103
1104 // Soft references
1105 {
1106 GCTraceTime(Debug, gc, ref) tm("Preclean SoftReferences", gc_timer);
1107 for (uint i = 0; i < _max_num_q; i++) {
1108 if (yield->should_return()) {
1109 return;
1110 }
1111 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
1112 keep_alive, complete_gc, yield);
|
1073 add_to_discovered_list_mt(*list, obj, discovered_addr);
1074 } else {
1075 // We do a raw store here: the field will be visited later when processing
1076 // the discovered references.
1077 oop current_head = list->head();
1078 // The last ref must have its discovered field pointing to itself.
1079 oop next_discovered = (current_head != NULL) ? current_head : obj;
1080
1081 assert(discovered == NULL, "control point invariant");
1082 oop_store_raw(discovered_addr, next_discovered);
1083 list->set_head(obj);
1084 list->inc_length(1);
1085
1086 log_develop_trace(gc, ref)("Discovered reference (" INTPTR_FORMAT ": %s)", p2i(obj), obj->klass()->internal_name());
1087 }
1088 assert(obj->is_oop(), "Discovered a bad reference");
1089 verify_referent(obj);
1090 return true;
1091 }
1092
1093 bool ReferenceProcessor::has_discovered_references() {
1094 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
1095 if (!_discovered_refs[i].is_empty()) {
1096 return true;
1097 }
1098 }
1099 return false;
1100 }
1101
1102 // Preclean the discovered references by removing those
1103 // whose referents are alive, and by marking from those that
1104 // are not active. These lists can be handled here
1105 // in any order and, indeed, concurrently.
1106 void ReferenceProcessor::preclean_discovered_references(
1107 BoolObjectClosure* is_alive,
1108 OopClosure* keep_alive,
1109 VoidClosure* complete_gc,
1110 YieldClosure* yield,
1111 GCTimer* gc_timer) {
1112
1113 // Soft references
1114 {
1115 GCTraceTime(Debug, gc, ref) tm("Preclean SoftReferences", gc_timer);
1116 for (uint i = 0; i < _max_num_q; i++) {
1117 if (yield->should_return()) {
1118 return;
1119 }
1120 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
1121 keep_alive, complete_gc, yield);
|