[infinispan-commits] Infinispan SVN: r1794 - in trunk/core/src/main/java/org/infinispan/util: concurrent/locks/containers and 1 other directory.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Mon May 17 10:33:20 EDT 2010


Author: manik.surtani at jboss.com
Date: 2010-05-17 10:33:19 -0400 (Mon, 17 May 2010)
New Revision: 1794

Modified:
   trunk/core/src/main/java/org/infinispan/util/Util.java
   trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractPerEntryLockContainer.java
   trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractStripedLockContainer.java
Log:
[ISPN-444] (Release lock when thread is interrupted)

Modified: trunk/core/src/main/java/org/infinispan/util/Util.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/Util.java	2010-05-17 11:04:32 UTC (rev 1793)
+++ trunk/core/src/main/java/org/infinispan/util/Util.java	2010-05-17 14:33:19 UTC (rev 1794)
@@ -33,6 +33,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
 
 /**
  * General utility methods used throughout the JBC code base.
@@ -271,4 +272,19 @@
       return s;
    }
 
+   /**
+    * Releases a lock and swallows any IllegalMonitorStateExceptions - so it is safe to call this method even if the
+    * lock is not locked, or not locked by the current thread.
+    *
+    * @param toRelease lock to release
+    */
+   public static final void safeRelease(Lock toRelease) {
+      if (toRelease != null) {
+         try {
+            toRelease.unlock();
+         } catch (IllegalMonitorStateException imse) {
+            // Perhaps the caller hadn't acquired the lock after all.
+         }
+      }
+   }
 }

Modified: trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractPerEntryLockContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractPerEntryLockContainer.java	2010-05-17 11:04:32 UTC (rev 1793)
+++ trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractPerEntryLockContainer.java	2010-05-17 14:33:19 UTC (rev 1794)
@@ -1,10 +1,14 @@
 package org.infinispan.util.concurrent.locks.containers;
 
+import org.infinispan.util.Util;
+
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 
+import static org.infinispan.util.Util.safeRelease;
+
 /**
  * An abstract lock container that creates and maintains a new lock per entry
  *
@@ -42,12 +46,19 @@
    public Lock acquireLock(Object key, long timeout, TimeUnit unit) throws InterruptedException {
       while (true) {
          Lock lock = getLock(key);
-         if (lock.tryLock(timeout, unit)) {
+         boolean locked = false;
+         try {
+            locked = lock.tryLock(timeout, unit);
+         } catch (Throwable th) {
+            safeRelease(lock);
+            locked = false;
+         }
+         if (locked) {
             // lock acquired.  Now check if it is the *correct* lock!
             Lock existingLock = locks.putIfAbsent(key, lock);
             if (existingLock != null && existingLock != lock) {
                // we have the wrong lock!  Unlock and retry.
-               lock.unlock();
+               safeRelease(lock);
             } else {
                // we got the right lock.
                return lock;

Modified: trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractStripedLockContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractStripedLockContainer.java	2010-05-17 11:04:32 UTC (rev 1793)
+++ trunk/core/src/main/java/org/infinispan/util/concurrent/locks/containers/AbstractStripedLockContainer.java	2010-05-17 14:33:19 UTC (rev 1794)
@@ -22,10 +22,13 @@
 package org.infinispan.util.concurrent.locks.containers;
 
 import net.jcip.annotations.ThreadSafe;
+import org.infinispan.util.Util;
 
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 
+import static org.infinispan.util.Util.safeRelease;
+
 /**
  * A container for locks.  Used with lock striping.
  *
@@ -78,7 +81,14 @@
 
    public Lock acquireLock(Object key, long timeout, TimeUnit unit) throws InterruptedException {
       Lock lock = getLock(key);
-      return lock.tryLock(timeout, unit) ? lock : null;
+      boolean locked = false;
+      try {
+         locked = lock.tryLock(timeout, unit);
+      } catch (Throwable th) {
+         safeRelease(lock);
+         locked = false;
+      }
+      return locked ? lock : null;
    }
 
    public void releaseLock(Object key) {



More information about the infinispan-commits mailing list