Author: toad
Date: 2008-03-11 15:08:11 +0000 (Tue, 11 Mar 2008)
New Revision: 18461

Modified:
   trunk/freenet/src/freenet/node/RequestSender.java
Log:
Prevent sendTerminal from being called twice when a race condition occurs.

Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java   2008-03-11 15:02:36 UTC 
(rev 18460)
+++ trunk/freenet/src/freenet/node/RequestSender.java   2008-03-11 15:08:11 UTC 
(rev 18461)
@@ -1179,27 +1179,37 @@
        }

        public void addListener(Listener l) {
+               // Only call here if we've already called for the other 
listeners.
+               // Therefore the callbacks will only be called once.
                boolean reject=false;
                boolean transfer=false;
+               boolean sentFinished;
                int status;
                synchronized (this) {
                        synchronized (listeners) {
                                listeners.add(l);
+                               reject = sentReceivedRejectOverload;
+                               transfer = sentCHKTransferBegins;
+                               sentFinished = sentRequestSenderFinished;
                        }
-                       reject=hasForwardedRejectedOverload;
-                       transfer=transferStarted();
+                       reject=reject && hasForwardedRejectedOverload;
+                       transfer=transfer && transferStarted();
                        status=this.status;
                }
                if (reject)
                        l.onReceivedRejectOverload();
                if (transfer)
                        l.onCHKTransferBegins();
-               if (status!=NOT_FINISHED)
+               if (status!=NOT_FINISHED && sentFinished)
                        l.onRequestSenderFinished(status);
        }

+       private boolean sentReceivedRejectOverload;
+       
        private void fireReceivedRejectOverload() {
                synchronized (listeners) {
+                       if(sentReceivedRejectOverload) return;
+                       sentReceivedRejectOverload = true;
                        Iterator i=listeners.iterator();
                        while (i.hasNext()) {
                                Listener l=(Listener)i.next();
@@ -1212,8 +1222,11 @@
                }
        }

+       private boolean sentCHKTransferBegins;
+       
        private void fireCHKTransferBegins() {
                synchronized (listeners) {
+                       sentCHKTransferBegins = true;
                        Iterator i=listeners.iterator();
                        while (i.hasNext()) {
                                Listener l=(Listener)i.next();
@@ -1226,8 +1239,11 @@
                }
        }

+       private boolean sentRequestSenderFinished;
+       
        private void fireRequestSenderFinished(int status) {
                synchronized (listeners) {
+                       sentRequestSenderFinished = true;
                        Iterator i=listeners.iterator();
                        while (i.hasNext()) {
                                Listener l=(Listener)i.next();


Reply via email to