[freenet-cvs] r16246 - trunk/freenet/src/freenet/node

toad at freenetproject.org toad at freenetproject.org
Mon Dec 3 21:43:57 UTC 2007


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) {




More information about the cvs mailing list