Author: toad
Date: 2008-03-04 13:49:33 +0000 (Tue, 04 Mar 2008)
New Revision: 18330

Modified:
   trunk/freenet/src/freenet/io/xfer/PacketThrottle.java
   trunk/freenet/src/freenet/node/KeyTracker.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Notify PacketThrottle when we disconnect, when we may have disconnected, when 
we change address.
So if we have in fact disconnected, it can kill any pending packets.

Modified: trunk/freenet/src/freenet/io/xfer/PacketThrottle.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/PacketThrottle.java       2008-03-04 
13:41:56 UTC (rev 18329)
+++ trunk/freenet/src/freenet/io/xfer/PacketThrottle.java       2008-03-04 
13:49:33 UTC (rev 18330)
@@ -254,4 +254,8 @@
                }

        }
+
+       public synchronized void maybeDisconnected() {
+               notifyAll();
+       }
 }

Modified: trunk/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- trunk/freenet/src/freenet/node/KeyTracker.java      2008-03-04 13:41:56 UTC 
(rev 18329)
+++ trunk/freenet/src/freenet/node/KeyTracker.java      2008-03-04 13:49:33 UTC 
(rev 18330)
@@ -600,9 +600,20 @@
                Logger.minor(this, "Executed "+cbCount+" callbacks");
     }

+    private PacketThrottle _lastThrottle;
+    
     PacketThrottle getThrottle() {
        // pn.getPeer() cannot be null as it has already connected.
-       return PacketThrottle.getThrottle(pn.getPeer(), Node.PACKET_SIZE);
+       PacketThrottle newThrottle = PacketThrottle.getThrottle(pn.getPeer(), 
Node.PACKET_SIZE);
+       PacketThrottle prevThrottle = null;
+       synchronized(this) {
+               if(newThrottle != _lastThrottle) {
+                       prevThrottle = _lastThrottle;
+                       _lastThrottle = newThrottle;
+               } else return newThrottle;
+       }
+       prevThrottle.maybeDisconnected();
+       return newThrottle;
        }

        /**
@@ -1000,6 +1011,8 @@
      * *** Must only be called if the KeyTracker is not to be kept. Otherwise, 
we may receive some packets twice. ***
      */
     public void completelyDeprecated(KeyTracker newTracker) {
+       if(_lastThrottle != null)
+               _lastThrottle.maybeDisconnected();
        if(logMINOR) Logger.minor(this, "Completely deprecated: "+this+" in 
favour of "+newTracker);
        LimitedRangeIntByteArrayMapElement[] elements = clear();
        if(elements.length == 0) return; // nothing more to do
@@ -1022,6 +1035,8 @@
      * Dump all sent messages.
      */
     public void disconnected() {
+       if(_lastThrottle != null)
+               _lastThrottle.maybeDisconnected();
         // Clear everything, call the callbacks
        LimitedRangeIntByteArrayMapElement[] elements = clear();
         for(int i=0;i<elements.length;i++) {

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-03-04 13:41:56 UTC 
(rev 18329)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-03-04 13:49:33 UTC 
(rev 18330)
@@ -1611,6 +1611,7 @@
                        } else
                                return;
                }
+               getThrottle().maybeDisconnected();
                sendIPAddressMessage();
        }



Reply via email to