src/hotspot/share/gc/shenandoah/shenandoahLock.hpp
changeset 59296 9186be5c78ba
parent 58675 0cc52a55fce4
equal deleted inserted replaced
59295:8b6cc0bb93d0 59296:9186be5c78ba
    23 
    23 
    24 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP
    24 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP
    25 #define SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP
    25 #define SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP
    26 
    26 
    27 #include "memory/allocation.hpp"
    27 #include "memory/allocation.hpp"
       
    28 #include "runtime/safepoint.hpp"
    28 #include "runtime/thread.hpp"
    29 #include "runtime/thread.hpp"
    29 
    30 
    30 class ShenandoahLock  {
    31 class ShenandoahLock  {
    31 private:
    32 private:
    32   enum LockState { unlocked = 0, locked = 1 };
    33   enum LockState { unlocked = 0, locked = 1 };
    94       _lock->unlock();
    95       _lock->unlock();
    95     }
    96     }
    96   }
    97   }
    97 };
    98 };
    98 
    99 
       
   100 class ShenandoahSimpleLock {
       
   101 private:
       
   102   os::PlatformMonitor   _lock; // native lock
       
   103 public:
       
   104   ShenandoahSimpleLock();
       
   105 
       
   106   virtual void lock();
       
   107   virtual void unlock();
       
   108 };
       
   109 
       
   110 class ShenandoahReentrantLock : public ShenandoahSimpleLock {
       
   111 private:
       
   112   Thread* volatile      _owner;
       
   113   uint64_t              _count;
       
   114 
       
   115 public:
       
   116   ShenandoahReentrantLock();
       
   117   ~ShenandoahReentrantLock();
       
   118 
       
   119   virtual void lock();
       
   120   virtual void unlock();
       
   121 
       
   122   // If the lock already owned by this thread
       
   123   bool owned_by_self() const ;
       
   124 };
       
   125 
       
   126 class ShenandoahReentrantLocker : public StackObj {
       
   127 private:
       
   128   ShenandoahReentrantLock* const _lock;
       
   129 
       
   130 public:
       
   131   ShenandoahReentrantLocker(ShenandoahReentrantLock* lock) :
       
   132     _lock(lock) {
       
   133     if (_lock != NULL) {
       
   134       _lock->lock();
       
   135     }
       
   136   }
       
   137 
       
   138   ~ShenandoahReentrantLocker() {
       
   139     if (_lock != NULL) {
       
   140       assert(_lock->owned_by_self(), "Must be owner");
       
   141       _lock->unlock();
       
   142     }
       
   143   }
       
   144 };
       
   145 
    99 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP
   146 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP