equal
deleted
inserted
replaced
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 |