[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