diff --git a/src/hotspot/share/gc/z/zOopClosures.inline.hpp b/src/hotspot/share/gc/z/zOopClosures.inline.hpp index 1a3c0b0..0a71d45 100644 --- a/src/hotspot/share/gc/z/zOopClosures.inline.hpp +++ b/src/hotspot/share/gc/z/zOopClosures.inline.hpp @@ -24,6 +24,8 @@ #ifndef SHARE_GC_Z_ZOOPCLOSURES_INLINE_HPP #define SHARE_GC_Z_ZOOPCLOSURES_INLINE_HPP +#include "classfile/classLoaderData.inline.hpp" +#include "gc/z/zAddress.inline.hpp" #include "gc/z/zBarrier.inline.hpp" #include "gc/z/zHeap.inline.hpp" #include "gc/z/zOop.inline.hpp" @@ -58,7 +60,7 @@ inline void ZRelocateRootOopClosure::do_oop(narrowOop* p) { template inline ZMarkBarrierOopClosure::ZMarkBarrierOopClosure() : - BasicOopIterateClosure(finalizable ? NULL : ZHeap::heap()->reference_discoverer()) {} + OopIterateClosure(finalizable ? NULL : ZHeap::heap()->reference_discoverer()) {} template inline void ZMarkBarrierOopClosure::do_oop(oop* p) { @@ -70,6 +72,34 @@ inline void ZMarkBarrierOopClosure::do_oop(narrowOop* p) { ShouldNotReachHere(); } +template +inline bool ZMarkBarrierOopClosure::do_metadata() { + return ClassUnloading; +} + +template +inline void ZMarkBarrierOopClosure::do_klass(Klass* k) { + ClassLoaderData* cld = k->class_loader_data(); + if (!cld->claim(finalizable)) { + return; + } + oop holder = cld->holder_no_keepalive(); + if (holder == NULL) { + return; + } + if (finalizable) { + ZHeap::heap()->mark_object(ZOop::to_address(holder)); + } else { + ZHeap::heap()->mark_object(ZOop::to_address(holder)); + } +} + +template +inline void ZMarkBarrierOopClosure::do_cld(ClassLoaderData* cld) { + ZMarkBarrierOopClosure cl; + cld->oops_do(&cl, false /* must_claim */); +} + inline bool ZPhantomIsAliveObjectClosure::do_object_b(oop o) { return ZBarrier::is_alive_barrier_on_phantom_oop(o); }