You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/11/25 16:05:51 UTC

svn commit: r1206202 - /james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponseImpl.java

Author: norman
Date: Fri Nov 25 15:05:50 2011
New Revision: 1206202

URL: http://svn.apache.org/viewvc?rev=1206202&view=rev
Log:
Don't hold lock while notify listeners

Modified:
    james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponseImpl.java

Modified: james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponseImpl.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponseImpl.java?rev=1206202&r1=1206201&r2=1206202&view=diff
==============================================================================
--- james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponseImpl.java (original)
+++ james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponseImpl.java Fri Nov 25 15:05:50 2011
@@ -32,8 +32,8 @@ import org.slf4j.LoggerFactory;
  */
 public class FutureResponseImpl implements FutureResponse{
 
-	private final static Logger LOGGER = LoggerFactory.getLogger(FutureResponseImpl.class);
-	
+    private final static Logger LOGGER = LoggerFactory.getLogger(FutureResponseImpl.class);
+
     protected Response response;
     private List<ResponseListener> listeners;
     private int waiters;
@@ -64,8 +64,10 @@ public class FutureResponseImpl implemen
 
     @Override
     public synchronized void removeListener(ResponseListener listener) {
-        if (listeners != null) {
-            listeners.remove(listener);
+        if (!isReady()) {
+            if (listeners != null) {
+                listeners.remove(listener);
+            }
         }
     }
 
@@ -100,14 +102,21 @@ public class FutureResponseImpl implemen
         return response.toString();
     }
     
-    public synchronized void setResponse(Response response) {
-        if (!isReady()) {
-        	this.response = response;
-            
-            if (waiters > 0) {
-                notifyAll();
+    public void setResponse(Response response) {
+        boolean fire = false;
+        synchronized (this) {
+            if (!isReady()) {
+                this.response = response;
+                fire = true;
+
+                if (waiters > 0) {
+                    notifyAll();
+                }
             }
-            for (ResponseListener listener: listeners) {
+        }
+
+        if (fire) {
+            for (ResponseListener listener : listeners) {
                 try {
                     listener.onResponse(this);
                 } catch (Throwable e) {



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org