Author: toad
Date: 2007-12-03 21:43:56 +0000 (Mon, 03 Dec 2007)
New Revision: 16246

Modified:
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Locking: always use messagesToSendNow to lock itself. Sometimes nested within 
PeerNode.this, but always take messages last.

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-12-03 21:37:47 UTC 
(rev 16245)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-12-03 21:43:56 UTC 
(rev 16246)
@@ -175,7 +175,8 @@
        final Node node;
        /** The PeerManager we serve */
        final PeerManager peers;
-       /** MessageItem's to send ASAP */
+       /** MessageItem's to send ASAP. 
+        * LOCKING: Lock on self, always take that lock last. Sometimes used 
inside PeerNode.this lock. */
        private final LinkedList messagesToSendNow;
        /** When did we last receive a SwapRequest? */
        private long timeLastReceivedSwapRequest;
@@ -1004,15 +1005,17 @@
                                previousTracker = null;
                                unverifiedTracker = null;
                        }
-                       if(dumpMessageQueue) {
-                               messagesToSendNow.clear();
-                       }
                        // Else DO NOT clear trackers, because hopefully it's a 
temporary connectivity glitch.
                        sendHandshakeTime = now;
                synchronized(this) {
                        timePrevDisconnect = timeLastDisconnect;
                        timeLastDisconnect = now;
                }
+                       if(dumpMessageQueue) {
+                               synchronized(messagesToSendNow) {
+                                       messagesToSendNow.clear();
+                               }
+                       }
                }
                node.lm.lostOrRestartedNode(this);
                setPeerNodeStatus(now);
@@ -1021,7 +1024,7 @@
                                public void run() {
                                        if(!PeerNode.this.isConnected() &&
                                                        timeLastDisconnect == 
now)
-                                               synchronized(PeerNode.this) {
+                                               
synchronized(PeerNode.this.messagesToSendNow) {
                                                        
PeerNode.this.messagesToSendNow.clear();
                                                }
                                }
@@ -1570,7 +1573,9 @@
                                // Messages do not persist across restarts.
                                // Generally they would be incomprehensible, 
anything that isn't should be sent as
                                // connection initial messages by 
maybeOnConnect().
-                               messagesToSendNow.clear();
+                               synchronized(messagesToSendNow) {
+                                       messagesToSendNow.clear();
+                               }
                        } // else it's a rekey
                        if(unverified) {
                                if(unverifiedTracker != null) {


Reply via email to