77 |
77 |
78 template <bool nv, typename T, class OopClosureType, class Contains> |
78 template <bool nv, typename T, class OopClosureType, class Contains> |
79 void InstanceRefKlass::oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) { |
79 void InstanceRefKlass::oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) { |
80 log_develop_trace(gc, ref)("Process reference with discovery " PTR_FORMAT, p2i(obj)); |
80 log_develop_trace(gc, ref)("Process reference with discovery " PTR_FORMAT, p2i(obj)); |
81 |
81 |
82 // Special case for some closures. |
|
83 if (closure->apply_to_weak_ref_discovered_field()) { |
|
84 do_discovered<nv, T>(obj, closure, contains); |
|
85 } |
|
86 |
|
87 // Try to discover reference and return if it succeeds. |
82 // Try to discover reference and return if it succeeds. |
88 if (try_discover<T>(obj, type, closure)) { |
83 if (try_discover<T>(obj, type, closure)) { |
89 return; |
84 return; |
90 } |
85 } |
91 |
86 |
114 (T*)java_lang_ref_Reference::next_addr(obj), |
109 (T*)java_lang_ref_Reference::next_addr(obj), |
115 (T*)java_lang_ref_Reference::discovered_addr(obj)); |
110 (T*)java_lang_ref_Reference::discovered_addr(obj)); |
116 } |
111 } |
117 |
112 |
118 template <bool nv, typename T, class OopClosureType, class Contains> |
113 template <bool nv, typename T, class OopClosureType, class Contains> |
|
114 void InstanceRefKlass::oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) { |
|
115 // Explicitly apply closure to the discovered field. |
|
116 do_discovered<nv, T>(obj, closure, contains); |
|
117 // Then do normal reference processing with discovery. |
|
118 oop_oop_iterate_discovery<nv, T>(obj, type, closure, contains); |
|
119 } |
|
120 |
|
121 template <bool nv, typename T, class OopClosureType, class Contains> |
119 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) { |
122 void InstanceRefKlass::oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains) { |
120 switch (closure->reference_iteration_mode()) { |
123 switch (closure->reference_iteration_mode()) { |
121 case ExtendedOopClosure::DO_DISCOVERY: |
124 case ExtendedOopClosure::DO_DISCOVERY: |
122 oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains); |
125 oop_oop_iterate_discovery<nv, T>(obj, reference_type(), closure, contains); |
|
126 break; |
|
127 case ExtendedOopClosure::DO_DISCOVERED_AND_DISCOVERY: |
|
128 oop_oop_iterate_discovered_and_discovery<nv, T>(obj, reference_type(), closure, contains); |
123 break; |
129 break; |
124 case ExtendedOopClosure::DO_FIELDS: |
130 case ExtendedOopClosure::DO_FIELDS: |
125 oop_oop_iterate_fields<nv, T>(obj, closure, contains); |
131 oop_oop_iterate_fields<nv, T>(obj, closure, contains); |
126 break; |
132 break; |
127 default: |
133 default: |