--- old/src/hotspot/share/gc/z/zLock.inline.hpp 2019-10-09 14:38:15.754945143 +0200 +++ new/src/hotspot/share/gc/z/zLock.inline.hpp 2019-10-09 14:38:15.491936577 +0200 @@ -80,12 +80,16 @@ template inline ZLocker::ZLocker(T* lock) : _lock(lock) { - _lock->lock(); + if (_lock != NULL) { + _lock->lock(); + } } template inline ZLocker::~ZLocker() { - _lock->unlock(); + if (_lock != NULL) { + _lock->unlock(); + } } #endif // SHARE_GC_Z_ZLOCK_INLINE_HPP --- old/src/hotspot/share/gc/z/zNMethodTable.cpp 2019-10-09 14:38:16.173958790 +0200 +++ new/src/hotspot/share/gc/z/zNMethodTable.cpp 2019-10-09 14:38:15.863948693 +0200 @@ -51,7 +51,7 @@ size_t ZNMethodTable::_nregistered = 0; size_t ZNMethodTable::_nunregistered = 0; ZNMethodTableIteration ZNMethodTable::_iteration; -ZSafeDelete ZNMethodTable::_safe_delete; +ZSafeDeleteNoLock ZNMethodTable::_safe_delete; size_t ZNMethodTable::first_index(const nmethod* nm, size_t size) { assert(is_power_of_2(size), "Invalid size"); --- old/src/hotspot/share/gc/z/zNMethodTable.hpp 2019-10-09 14:38:16.607972925 +0200 +++ new/src/hotspot/share/gc/z/zNMethodTable.hpp 2019-10-09 14:38:16.288962536 +0200 @@ -35,12 +35,12 @@ class ZNMethodTable : public AllStatic { private: - static ZNMethodTableEntry* _table; - static size_t _size; - static size_t _nregistered; - static size_t _nunregistered; - static ZNMethodTableIteration _iteration; - static ZSafeDelete _safe_delete; + static ZNMethodTableEntry* _table; + static size_t _size; + static size_t _nregistered; + static size_t _nunregistered; + static ZNMethodTableIteration _iteration; + static ZSafeDeleteNoLock _safe_delete; static ZNMethodTableEntry* create(size_t size); static void destroy(ZNMethodTableEntry* table); --- old/src/hotspot/share/gc/z/zSafeDelete.hpp 2019-10-09 14:38:16.986985269 +0200 +++ new/src/hotspot/share/gc/z/zSafeDelete.hpp 2019-10-09 14:38:16.720976606 +0200 @@ -29,11 +29,11 @@ #include "metaprogramming/removeExtent.hpp" template -class ZSafeDelete { +class ZSafeDeleteImpl { private: typedef typename RemoveExtent::type ItemT; - ZLock _lock; + ZLock* _lock; uint64_t _enabled; ZArray _deferred; @@ -41,7 +41,7 @@ void immediate_delete(ItemT* item); public: - ZSafeDelete(); + ZSafeDeleteImpl(ZLock* lock); void enable_deferred_delete(); void disable_deferred_delete(); @@ -49,4 +49,19 @@ void operator()(ItemT* item); }; +template +class ZSafeDelete : public ZSafeDeleteImpl { +private: + ZLock _lock; + +public: + ZSafeDelete(); +}; + +template +class ZSafeDeleteNoLock : public ZSafeDeleteImpl { +public: + ZSafeDeleteNoLock(); +}; + #endif // SHARE_GC_Z_ZSAFEDELETE_HPP --- old/src/hotspot/share/gc/z/zSafeDelete.inline.hpp 2019-10-09 14:38:17.376997972 +0200 +++ new/src/hotspot/share/gc/z/zSafeDelete.inline.hpp 2019-10-09 14:38:17.099988950 +0200 @@ -30,14 +30,14 @@ #include "utilities/debug.hpp" template -ZSafeDelete::ZSafeDelete() : - _lock(), +ZSafeDeleteImpl::ZSafeDeleteImpl(ZLock* lock) : + _lock(lock), _enabled(0), _deferred() {} template -bool ZSafeDelete::deferred_delete(ItemT* item) { - ZLocker locker(&_lock); +bool ZSafeDeleteImpl::deferred_delete(ItemT* item) { + ZLocker locker(_lock); if (_enabled > 0) { _deferred.add(item); return true; @@ -47,7 +47,7 @@ } template -void ZSafeDelete::immediate_delete(ItemT* item) { +void ZSafeDeleteImpl::immediate_delete(ItemT* item) { if (IsArray::value) { delete [] item; } else { @@ -56,17 +56,17 @@ } template -void ZSafeDelete::enable_deferred_delete() { - ZLocker locker(&_lock); +void ZSafeDeleteImpl::enable_deferred_delete() { + ZLocker locker(_lock); _enabled++; } template -void ZSafeDelete::disable_deferred_delete() { +void ZSafeDeleteImpl::disable_deferred_delete() { ZArray deferred; { - ZLocker locker(&_lock); + ZLocker locker(_lock); assert(_enabled > 0, "Invalid state"); if (--_enabled == 0) { deferred.transfer(&_deferred); @@ -80,10 +80,19 @@ } template -void ZSafeDelete::operator()(ItemT* item) { +void ZSafeDeleteImpl::operator()(ItemT* item) { if (!deferred_delete(item)) { immediate_delete(item); } } +template +ZSafeDelete::ZSafeDelete() : + ZSafeDeleteImpl(&_lock), + _lock() {} + +template +ZSafeDeleteNoLock::ZSafeDeleteNoLock() : + ZSafeDeleteImpl(NULL) {} + #endif // SHARE_GC_Z_ZSAFEDELETE_INLINE_HPP