[infinispan-commits] Infinispan SVN: r1397 - trunk/core/src/main/java/org/infinispan/util/concurrent.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Tue Jan 19 10:57:51 EST 2010


Author: manik.surtani at jboss.com
Date: 2010-01-19 10:57:51 -0500 (Tue, 19 Jan 2010)
New Revision: 1397

Modified:
   trunk/core/src/main/java/org/infinispan/util/concurrent/AggregatingNotifyingFutureImpl.java
   trunk/core/src/main/java/org/infinispan/util/concurrent/NotifyingFutureImpl.java
Log:
Handle race condition between adding listeners and firing notifications.

Modified: trunk/core/src/main/java/org/infinispan/util/concurrent/AggregatingNotifyingFutureImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/concurrent/AggregatingNotifyingFutureImpl.java	2010-01-19 15:49:32 UTC (rev 1396)
+++ trunk/core/src/main/java/org/infinispan/util/concurrent/AggregatingNotifyingFutureImpl.java	2010-01-19 15:57:51 UTC (rev 1397)
@@ -61,9 +61,6 @@
 
    @Override
    public void notifyDone() {
-      if (awaitingCompletions.decrementAndGet() == 0) {
-         callCompleted = true;
-         for (FutureListener<Object> l : listeners) l.futureDone(this);
-      }
+      if (awaitingCompletions.decrementAndGet() == 0) super.notifyDone();
    }
 }

Modified: trunk/core/src/main/java/org/infinispan/util/concurrent/NotifyingFutureImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/concurrent/NotifyingFutureImpl.java	2010-01-19 15:49:32 UTC (rev 1396)
+++ trunk/core/src/main/java/org/infinispan/util/concurrent/NotifyingFutureImpl.java	2010-01-19 15:57:51 UTC (rev 1397)
@@ -5,6 +5,8 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
  * Constructs an instance of a {@link org.infinispan.util.concurrent.NotifyingFuture}.
@@ -23,6 +25,7 @@
    volatile Future<Object> ioFuture;
    volatile boolean callCompleted = false;
    final Set<FutureListener<Object>> listeners = new CopyOnWriteArraySet<FutureListener<Object>>();
+   final ReadWriteLock listenerLock = new ReentrantReadWriteLock();
 
    public NotifyingFutureImpl(Object actualReturnValue) {
       this.actualReturnValue = actualReturnValue;
@@ -55,13 +58,23 @@
    }
 
    public void notifyDone() {
-      callCompleted = true;
-      for (FutureListener<Object> l : listeners) l.futureDone(this);
+      listenerLock.writeLock().lock();
+      try {
+         callCompleted = true;
+         for (FutureListener<Object> l : listeners) l.futureDone(this);
+      } finally {
+         listenerLock.writeLock().unlock();
+      }
    }
 
    public NotifyingFuture<Object> attachListener(FutureListener<Object> objectFutureListener) {
-      if (!callCompleted) listeners.add(objectFutureListener);
-      if (callCompleted) objectFutureListener.futureDone(this);
-      return this;
+      listenerLock.readLock().lock();
+      try {
+         if (!callCompleted) listeners.add(objectFutureListener);
+         if (callCompleted) objectFutureListener.futureDone(this);
+         return this;
+      } finally {
+         listenerLock.readLock().unlock();
+      }
    }
 }
\ No newline at end of file



More information about the infinispan-commits mailing list