27
27
#include " gc/shared/gc_globals.hpp"
28
28
#include " gc/shared/taskqueue.inline.hpp"
29
29
#include " gc/z/zAddress.inline.hpp"
30
+ #include " gc/z/zCollectedHeap.hpp"
30
31
#include " gc/z/zGlobals.hpp"
31
32
#include " gc/z/zGranuleMap.inline.hpp"
32
33
#include " gc/z/zHeapIterator.hpp"
@@ -123,12 +124,14 @@ class ZHeapIteratorRootOopClosure : public OopClosure {
123
124
};
124
125
125
126
template <bool VisitReferents>
126
- class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
127
+ class ZHeapIteratorOopClosure : public OopIterateClosure {
127
128
private:
128
129
const ZHeapIteratorContext& _context;
129
130
const oop _base;
130
131
131
132
oop load_oop (oop* p) {
133
+ assert (ZCollectedHeap::heap ()->is_in (p), " Should be in heap" );
134
+
132
135
if (VisitReferents) {
133
136
return HeapAccess<AS_NO_KEEPALIVE | ON_UNKNOWN_OOP_REF>::oop_load_at (_base, _base->field_offset (p));
134
137
}
@@ -138,7 +141,7 @@ class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
138
141
139
142
public:
140
143
ZHeapIteratorOopClosure (const ZHeapIteratorContext& context, oop base) :
141
- ClaimMetadataVisitingOopIterateClosure (ClassLoaderData::_claim_other ),
144
+ OopIterateClosure ( ),
142
145
_context (context),
143
146
_base (base) {}
144
147
@@ -154,6 +157,39 @@ class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
154
157
virtual void do_oop (narrowOop* p) {
155
158
ShouldNotReachHere ();
156
159
}
160
+
161
+ virtual bool do_metadata () {
162
+ return true ;
163
+ }
164
+
165
+ virtual void do_klass (Klass* k) {
166
+ ClassLoaderData* const cld = k->class_loader_data ();
167
+ ZHeapIteratorOopClosure::do_cld (cld);
168
+ }
169
+
170
+ virtual void do_cld (ClassLoaderData* cld) {
171
+ class NativeAccessClosure : public OopClosure {
172
+ private:
173
+ const ZHeapIteratorContext& _context;
174
+
175
+ public:
176
+ explicit NativeAccessClosure (const ZHeapIteratorContext& context) :
177
+ _context(context) {}
178
+
179
+ virtual void do_oop (oop* p) {
180
+ assert (!ZCollectedHeap::heap ()->is_in (p), " Should not be in heap" );
181
+ const oop obj = NativeAccess<AS_NO_KEEPALIVE>::oop_load (p);
182
+ _context.mark_and_push (obj);
183
+ }
184
+
185
+ virtual void do_oop (narrowOop* p) {
186
+ ShouldNotReachHere ();
187
+ }
188
+ };
189
+
190
+ NativeAccessClosure cl (_context);
191
+ cld->oops_do (&cl, ClassLoaderData::_claim_other);
192
+ }
157
193
};
158
194
159
195
ZHeapIterator::ZHeapIterator (uint nworkers, bool visit_weaks) :
0 commit comments