20 * or visit www.oracle.com if you need additional information or have any |
20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. |
21 * questions. |
22 */ |
22 */ |
23 |
23 |
24 #include "precompiled.hpp" |
24 #include "precompiled.hpp" |
|
25 #include "classfile/classLoaderData.hpp" |
|
26 #include "classfile/classLoaderDataGraph.hpp" |
25 #include "gc/z/zBarrier.inline.hpp" |
27 #include "gc/z/zBarrier.inline.hpp" |
26 #include "gc/z/zGlobals.hpp" |
28 #include "gc/z/zGlobals.hpp" |
27 #include "gc/z/zGranuleMap.inline.hpp" |
29 #include "gc/z/zGranuleMap.inline.hpp" |
28 #include "gc/z/zHeapIterator.hpp" |
30 #include "gc/z/zHeapIterator.hpp" |
29 #include "gc/z/zOop.inline.hpp" |
31 #include "gc/z/zOop.inline.hpp" |
96 return HeapAccess<AS_NO_KEEPALIVE>::oop_load(p); |
98 return HeapAccess<AS_NO_KEEPALIVE>::oop_load(p); |
97 } |
99 } |
98 |
100 |
99 public: |
101 public: |
100 ZHeapIteratorOopClosure(ZHeapIterator* iter, oop base) : |
102 ZHeapIteratorOopClosure(ZHeapIterator* iter, oop base) : |
|
103 ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_other), |
101 _iter(iter), |
104 _iter(iter), |
102 _base(base) {} |
105 _base(base) {} |
103 |
106 |
104 virtual ReferenceIterationMode reference_iteration_mode() { |
107 virtual ReferenceIterationMode reference_iteration_mode() { |
105 return VisitReferents ? DO_FIELDS : DO_FIELDS_EXCEPT_REFERENT; |
108 return VisitReferents ? DO_FIELDS : DO_FIELDS_EXCEPT_REFERENT; |
128 ZHeapIterator::~ZHeapIterator() { |
131 ZHeapIterator::~ZHeapIterator() { |
129 ZVisitMapIterator iter(&_visit_map); |
132 ZVisitMapIterator iter(&_visit_map); |
130 for (ZHeapIteratorBitMap* map; iter.next(&map);) { |
133 for (ZHeapIteratorBitMap* map; iter.next(&map);) { |
131 delete map; |
134 delete map; |
132 } |
135 } |
|
136 ClassLoaderDataGraph::clear_claimed_marks(ClassLoaderData::_claim_other); |
133 } |
137 } |
134 |
138 |
135 static size_t object_index_max() { |
139 static size_t object_index_max() { |
136 return ZGranuleSize >> ZObjectAlignmentSmallShift; |
140 return ZGranuleSize >> ZObjectAlignmentSmallShift; |
137 } |
141 } |
182 void ZHeapIterator::push_fields(oop obj) { |
186 void ZHeapIterator::push_fields(oop obj) { |
183 ZHeapIteratorOopClosure<VisitReferents> cl(this, obj); |
187 ZHeapIteratorOopClosure<VisitReferents> cl(this, obj); |
184 obj->oop_iterate(&cl); |
188 obj->oop_iterate(&cl); |
185 } |
189 } |
186 |
190 |
187 template <bool VisitReferents> |
191 class ZHeapIterateConcurrentRootsIterator : public ZConcurrentRootsIterator { |
|
192 public: |
|
193 ZHeapIterateConcurrentRootsIterator() : |
|
194 ZConcurrentRootsIterator(ClassLoaderData::_claim_other) {} |
|
195 }; |
|
196 |
|
197 template <bool VisitWeaks> |
188 void ZHeapIterator::objects_do(ObjectClosure* cl) { |
198 void ZHeapIterator::objects_do(ObjectClosure* cl) { |
189 ZStatTimerDisable disable; |
199 ZStatTimerDisable disable; |
190 |
200 |
191 // Push roots to visit |
201 // Push roots to visit |
192 push_roots<ZRootsIterator, false /* Concurrent */, false /* Weak */>(); |
202 push_roots<ZRootsIterator, false /* Concurrent */, false /* Weak */>(); |
193 push_roots<ZConcurrentRootsIterator, true /* Concurrent */, false /* Weak */>(); |
203 push_roots<ZHeapIterateConcurrentRootsIterator, true /* Concurrent */, false /* Weak */>(); |
194 push_roots<ZWeakRootsIterator, false /* Concurrent */, true /* Weak */>(); |
204 if (VisitWeaks) { |
195 push_roots<ZConcurrentWeakRootsIterator, true /* Concurrent */, true /* Weak */>(); |
205 push_roots<ZWeakRootsIterator, false /* Concurrent */, true /* Weak */>(); |
|
206 push_roots<ZConcurrentWeakRootsIterator, true /* Concurrent */, true /* Weak */>(); |
|
207 } |
196 |
208 |
197 // Drain stack |
209 // Drain stack |
198 while (!_visit_stack.is_empty()) { |
210 while (!_visit_stack.is_empty()) { |
199 const oop obj = _visit_stack.pop(); |
211 const oop obj = _visit_stack.pop(); |
200 |
212 |
201 // Visit object |
213 // Visit object |
202 cl->do_object(obj); |
214 cl->do_object(obj); |
203 |
215 |
204 // Push fields to visit |
216 // Push fields to visit |
205 push_fields<VisitReferents>(obj); |
217 push_fields<VisitWeaks>(obj); |
206 } |
218 } |
207 } |
219 } |
208 |
220 |
209 void ZHeapIterator::objects_do(ObjectClosure* cl, bool visit_referents) { |
221 void ZHeapIterator::objects_do(ObjectClosure* cl, bool visit_weaks) { |
210 if (visit_referents) { |
222 if (visit_weaks) { |
211 objects_do<true /* VisitReferents */>(cl); |
223 objects_do<true /* VisitWeaks */>(cl); |
212 } else { |
224 } else { |
213 objects_do<false /* VisitReferents */>(cl); |
225 objects_do<false /* VisitWeaks */>(cl); |
214 } |
226 } |
215 } |
227 } |