< 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 >