diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index 45d6275..6e7ed16 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -1377,6 +1377,8 @@ void nmethod::flush() { } #endif + Universe::heap()->flush_nmethod(this); + CodeBlob::flush(); CodeCache::free(this); } diff --git a/src/hotspot/share/gc/shared/collectedHeap.hpp b/src/hotspot/share/gc/shared/collectedHeap.hpp index b9d220f..cb4edf3 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.hpp +++ b/src/hotspot/share/gc/shared/collectedHeap.hpp @@ -521,6 +521,7 @@ class CollectedHeap : public CHeapObj { // Override with specific mechanism for each specialized heap type. virtual void register_nmethod(nmethod* nm) {} virtual void unregister_nmethod(nmethod* nm) {} + virtual void flush_nmethod(nmethod* nm) {} virtual void verify_nmethod(nmethod* nmethod) {} void trace_heap_before_gc(const GCTracer* gc_tracer); diff --git a/src/hotspot/share/gc/z/zCollectedHeap.cpp b/src/hotspot/share/gc/z/zCollectedHeap.cpp index 4975101..79820a3 100644 --- a/src/hotspot/share/gc/z/zCollectedHeap.cpp +++ b/src/hotspot/share/gc/z/zCollectedHeap.cpp @@ -262,6 +262,10 @@ void ZCollectedHeap::unregister_nmethod(nmethod* nm) { ZNMethod::unregister_nmethod(nm); } +void ZCollectedHeap::flush_nmethod(nmethod* nm) { + ZNMethod::flush_nmethod(nm); +} + void ZCollectedHeap::verify_nmethod(nmethod* nm) { // Does nothing } diff --git a/src/hotspot/share/gc/z/zCollectedHeap.hpp b/src/hotspot/share/gc/z/zCollectedHeap.hpp index 02dd3d3..c1f6467 100644 --- a/src/hotspot/share/gc/z/zCollectedHeap.hpp +++ b/src/hotspot/share/gc/z/zCollectedHeap.hpp @@ -105,6 +105,7 @@ public: virtual void register_nmethod(nmethod* nm); virtual void unregister_nmethod(nmethod* nm); + virtual void flush_nmethod(nmethod* nm); virtual void verify_nmethod(nmethod* nmethod); virtual WorkGang* get_safepoint_workers(); diff --git a/src/hotspot/share/gc/z/zNMethod.cpp b/src/hotspot/share/gc/z/zNMethod.cpp index 16d05c9..420701a 100644 --- a/src/hotspot/share/gc/z/zNMethod.cpp +++ b/src/hotspot/share/gc/z/zNMethod.cpp @@ -82,7 +82,7 @@ void ZNMethod::attach_gc_data(nmethod* nm) { // Attach GC data to nmethod ZNMethodData* data = gc_data(nm); if (data == NULL) { - data = ZNMethodData::create(nm); + data = new ZNMethodData(); set_gc_data(nm, data); } @@ -92,18 +92,8 @@ void ZNMethod::attach_gc_data(nmethod* nm) { ZNMethodDataOops::destroy(old_oops); } -void ZNMethod::detach_gc_data(nmethod* nm) { - // Destroy GC data - ZNMethodData::destroy(gc_data(nm)); - set_gc_data(nm, NULL); -} - ZReentrantLock* ZNMethod::lock_for_nmethod(nmethod* nm) { - ZNMethodData* const data = gc_data(nm); - if (data == NULL) { - return NULL; - } - return data->lock(); + return gc_data(nm)->lock(); } void ZNMethod::log_register(const nmethod* nm) { @@ -190,9 +180,11 @@ void ZNMethod::unregister_nmethod(nmethod* nm) { log_unregister(nm); ZNMethodTable::unregister_nmethod(nm); +} - // Destroy and detach gc data - detach_gc_data(nm); +void ZNMethod::flush_nmethod(nmethod* nm) { + // Destroy GC data + delete gc_data(nm); } void ZNMethod::disarm_nmethod(nmethod* nm) { diff --git a/src/hotspot/share/gc/z/zNMethod.hpp b/src/hotspot/share/gc/z/zNMethod.hpp index 5146a35..987683c 100644 --- a/src/hotspot/share/gc/z/zNMethod.hpp +++ b/src/hotspot/share/gc/z/zNMethod.hpp @@ -34,7 +34,6 @@ class ZWorkers; class ZNMethod : public AllStatic { private: static void attach_gc_data(nmethod* nm); - static void detach_gc_data(nmethod* nm); static void log_register(const nmethod* nm); static void log_unregister(const nmethod* nm); @@ -42,6 +41,7 @@ private: public: static void register_nmethod(nmethod* nm); static void unregister_nmethod(nmethod* nm); + static void flush_nmethod(nmethod* nm); static void disarm_nmethod(nmethod* nm); diff --git a/src/hotspot/share/gc/z/zNMethodData.cpp b/src/hotspot/share/gc/z/zNMethodData.cpp index 995c111..56af0c6 100644 --- a/src/hotspot/share/gc/z/zNMethodData.cpp +++ b/src/hotspot/share/gc/z/zNMethodData.cpp @@ -76,20 +76,14 @@ bool ZNMethodDataOops::has_non_immediates() const { return _has_non_immediates; } -ZNMethodData* ZNMethodData::create(nmethod* nm) { - void* const mem = ZNMethodAllocator::allocate(sizeof(ZNMethodData)); - return ::new (mem) ZNMethodData(nm); -} - -void ZNMethodData::destroy(ZNMethodData* data) { - ZNMethodAllocator::free(data->oops()); - ZNMethodAllocator::free(data); -} - -ZNMethodData::ZNMethodData(nmethod* nm) : +ZNMethodData::ZNMethodData() : _lock(), _oops(NULL) {} +ZNMethodData::~ZNMethodData() { + ZNMethodAllocator::free(_oops); +} + ZReentrantLock* ZNMethodData::lock() { return &_lock; } diff --git a/src/hotspot/share/gc/z/zNMethodData.hpp b/src/hotspot/share/gc/z/zNMethodData.hpp index 8240e85..ed8b9ea 100644 --- a/src/hotspot/share/gc/z/zNMethodData.hpp +++ b/src/hotspot/share/gc/z/zNMethodData.hpp @@ -22,6 +22,7 @@ */ #include "gc/z/zLock.hpp" +#include "memory/allocation.hpp" #include "oops/oopsHierarchy.hpp" #include "utilities/globalDefinitions.hpp" @@ -51,16 +52,14 @@ public: bool has_non_immediates() const; }; -class ZNMethodData { +class ZNMethodData : public CHeapObj { private: ZReentrantLock _lock; ZNMethodDataOops* volatile _oops; - ZNMethodData(nmethod* nm); - public: - static ZNMethodData* create(nmethod* nm); - static void destroy(ZNMethodData* data); + ZNMethodData(); + ~ZNMethodData(); ZReentrantLock* lock(); diff --git a/src/hotspot/share/gc/z/zUnload.cpp b/src/hotspot/share/gc/z/zUnload.cpp index 8f09d76..006c04e 100644 --- a/src/hotspot/share/gc/z/zUnload.cpp +++ b/src/hotspot/share/gc/z/zUnload.cpp @@ -65,23 +65,14 @@ public: }; class ZIsUnloadingBehaviour : public IsUnloadingBehaviour { -private: - bool is_unloading(nmethod* nm) const { - ZIsUnloadingOopClosure cl; - nm->oops_do(&cl, true /* allow_zombie */); - return cl.is_unloading(); - } - public: virtual bool is_unloading(CompiledMethod* method) const { nmethod* const nm = method->as_nmethod(); ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); - if (lock == NULL) { - return is_unloading(nm); - } else { - ZLocker locker(lock); - return is_unloading(nm); - } + ZLocker locker(lock); + ZIsUnloadingOopClosure cl; + nm->oops_do(&cl, true /* allow_zombie */); + return cl.is_unloading(); } }; @@ -90,18 +81,14 @@ public: virtual bool lock(CompiledMethod* method) { nmethod* const nm = method->as_nmethod(); ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); - if (lock != NULL) { - lock->lock(); - } + lock->lock(); return true; } virtual void unlock(CompiledMethod* method) { nmethod* const nm = method->as_nmethod(); ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); - if (lock != NULL) { - lock->unlock(); - } + lock->unlock(); } virtual bool is_safe(CompiledMethod* method) { @@ -111,7 +98,7 @@ public: nmethod* const nm = method->as_nmethod(); ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); - return lock == NULL || lock->is_owned(); + return lock->is_owned(); } };