diff -r 8b6cc0bb93d0 -r 9186be5c78ba src/hotspot/share/gc/shenandoah/shenandoahLock.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp Wed Nov 27 06:36:41 2019 -0800 +++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp Wed Nov 27 11:52:57 2019 -0500 @@ -25,6 +25,7 @@ #define SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP #include "memory/allocation.hpp" +#include "runtime/safepoint.hpp" #include "runtime/thread.hpp" class ShenandoahLock { @@ -96,4 +97,50 @@ } }; +class ShenandoahSimpleLock { +private: + os::PlatformMonitor _lock; // native lock +public: + ShenandoahSimpleLock(); + + virtual void lock(); + virtual void unlock(); +}; + +class ShenandoahReentrantLock : public ShenandoahSimpleLock { +private: + Thread* volatile _owner; + uint64_t _count; + +public: + ShenandoahReentrantLock(); + ~ShenandoahReentrantLock(); + + virtual void lock(); + virtual void unlock(); + + // If the lock already owned by this thread + bool owned_by_self() const ; +}; + +class ShenandoahReentrantLocker : public StackObj { +private: + ShenandoahReentrantLock* const _lock; + +public: + ShenandoahReentrantLocker(ShenandoahReentrantLock* lock) : + _lock(lock) { + if (_lock != NULL) { + _lock->lock(); + } + } + + ~ShenandoahReentrantLocker() { + if (_lock != NULL) { + assert(_lock->owned_by_self(), "Must be owner"); + _lock->unlock(); + } + } +}; + #endif // SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP