Author: toad
Date: 2008-01-22 22:43:07 +0000 (Tue, 22 Jan 2008)
New Revision: 17199

Modified:
   trunk/freenet/src/freenet/node/RequestHandler.java
Log:
Don't leak (fail to unregister) if we lose the connection, get a fatal error 
etc when sending a terminal message.

Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java  2008-01-22 22:38:44 UTC 
(rev 17198)
+++ trunk/freenet/src/freenet/node/RequestHandler.java  2008-01-22 22:43:07 UTC 
(rev 17199)
@@ -390,23 +390,36 @@
      */
     private class TerminalMessageByteCountCollector implements 
AsyncMessageCallback {

+       private boolean completed = false;
+       
                public void acknowledged() {
             //terminalMessage ack'd by remote peer
+                       complete();
                }

                public void disconnected() {
             Logger.minor(this, "Peer disconnected before terminal message sent 
for "+RequestHandler.this);
+            complete();
                }

                public void fatalError() {
                        Logger.error(this, "Error sending terminal message?! 
for " + RequestHandler.this);
+                       complete();
                }

                public void sent() {
+                       complete();
+        }
+               
+               private void complete() {
+                       synchronized(this) {
+                               if(completed) return;
+                               completed = true;
+                       }
             //For byte counting, this relies on the fact that the callback 
will only be excuted once.
                        applyByteCounts();
                        unregisterRequestHandlerWithNode();
-        }
+               }
        }

     /**


Reply via email to