Skip to content

Commit 47d4438

Browse files
albertnetymkplidenfiskstefank
committed
8266426: ZHeapIteratorOopClosure does not handle native access properly
Co-authored-by: Per Liden <pliden@openjdk.org> Co-authored-by: Erik Österlund <eosterlund@openjdk.org> Co-authored-by: Stefan Karlsson <stefank@openjdk.org> Reviewed-by: stefank, pliden
1 parent 2438498 commit 47d4438

File tree

1 file changed

+38
-2
lines changed

1 file changed

+38
-2
lines changed

src/hotspot/share/gc/z/zHeapIterator.cpp

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "gc/shared/gc_globals.hpp"
2828
#include "gc/shared/taskqueue.inline.hpp"
2929
#include "gc/z/zAddress.inline.hpp"
30+
#include "gc/z/zCollectedHeap.hpp"
3031
#include "gc/z/zGlobals.hpp"
3132
#include "gc/z/zGranuleMap.inline.hpp"
3233
#include "gc/z/zHeapIterator.hpp"
@@ -123,12 +124,14 @@ class ZHeapIteratorRootOopClosure : public OopClosure {
123124
};
124125

125126
template <bool VisitReferents>
126-
class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
127+
class ZHeapIteratorOopClosure : public OopIterateClosure {
127128
private:
128129
const ZHeapIteratorContext& _context;
129130
const oop _base;
130131

131132
oop load_oop(oop* p) {
133+
assert(ZCollectedHeap::heap()->is_in(p), "Should be in heap");
134+
132135
if (VisitReferents) {
133136
return HeapAccess<AS_NO_KEEPALIVE | ON_UNKNOWN_OOP_REF>::oop_load_at(_base, _base->field_offset(p));
134137
}
@@ -138,7 +141,7 @@ class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
138141

139142
public:
140143
ZHeapIteratorOopClosure(const ZHeapIteratorContext& context, oop base) :
141-
ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_other),
144+
OopIterateClosure(),
142145
_context(context),
143146
_base(base) {}
144147

@@ -154,6 +157,39 @@ class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
154157
virtual void do_oop(narrowOop* p) {
155158
ShouldNotReachHere();
156159
}
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+
}
157193
};
158194

159195
ZHeapIterator::ZHeapIterator(uint nworkers, bool visit_weaks) :

0 commit comments

Comments
 (0)