[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