Author: toad
Date: 2007-09-22 15:06:07 +0000 (Sat, 22 Sep 2007)
New Revision: 15264

Modified:
   trunk/freenet/src/freenet/node/OpennetManager.java
Log:
avoid nested locks in one case, document the other

Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-22 15:02:54 UTC 
(rev 15263)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-22 15:06:07 UTC 
(rev 15264)
@@ -250,17 +250,20 @@
                                                
peersLRU.pushLeast(nodeToAddNow);
                                        else
                                                peersLRU.push(nodeToAddNow);
-                                       // Always take OpennetManager lock 
before PeerManager
-                                       node.peers.addPeer(nodeToAddNow, true);
                                        oldPeers.remove(nodeToAddNow);
                                } else {
                                        if(logMINOR) Logger.minor(this, "Want 
peer because not enough opennet nodes");
                                }
                                timeLastOffered = System.currentTimeMillis();
-                               return true;
+                               ret = true;
                        }
                        noDisconnect = successCount < 
MIN_SUCCESS_BETWEEN_DROP_CONNS;
                }
+               if(ret) {
+                       if(nodeToAddNow != null)
+                               node.peers.addPeer(nodeToAddNow, true); // Add 
to peers outside the OM lock
+                       return true;
+               }
                Vector dropList = new Vector();
                synchronized(this) {
                        boolean hasDisconnected = false;
@@ -288,6 +291,7 @@
                        if(ret) {
                                long now = System.currentTimeMillis();
                                if(nodeToAddNow != null) {
+                                       // Here we can't avoid nested locks. So 
always take the OpennetManager lock first.
                                        if(!node.peers.addPeer(nodeToAddNow)) {
                                                // Can't add it, already 
present (some sort of race condition)
                                                PeerNode readd = (PeerNode) 
dropList.remove(dropList.size()-1);


Reply via email to