< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahLock.cpp
Print this page
rev 59811 : 8247670: Shenandoah: deadlock during class unloading OOME
@@ -41,10 +41,14 @@
void ShenandoahSimpleLock::unlock() {
_lock.unlock();
}
+bool ShenandoahSimpleLock::try_lock() {
+ return _lock.try_lock();
+}
+
ShenandoahReentrantLock::ShenandoahReentrantLock() :
ShenandoahSimpleLock(), _owner(NULL), _count(0) {
assert(os::mutex_init_done(), "Too early!");
}
@@ -62,10 +66,25 @@
}
_count++;
}
+bool ShenandoahReentrantLock::try_lock() {
+ Thread* const thread = Thread::current();
+ Thread* const owner = Atomic::load(&_owner);
+
+ if (owner != thread) {
+ if (!ShenandoahSimpleLock::try_lock()) {
+ return false;
+ }
+ Atomic::store(&_owner, thread);
+ }
+
+ _count++;
+ return true;
+}
+
void ShenandoahReentrantLock::unlock() {
assert(owned_by_self(), "Invalid owner");
assert(_count > 0, "Invalid count");
_count--;
< prev index next >