From 4ccac88cf662b8f50afeaea13451550ae4c0b21e Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Fri, 17 Oct 2008 20:30:50 +0000
Subject: * Don't worry about trying to populate the other dictionaries if a
 client's circuitcode is already found in the first one

---
 .../Region/ClientStack/LindenUDP/LLUDPServer.cs    | 35 ++++++++++++++--------
 1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 01a4dd6..a4a6b93 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -46,12 +46,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
     {
         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
+        /// <value>
+        /// The client circuits established with this UDP server.  If a client exists here we can also assume that
+        /// it is populated in clientCircuits_reverse and proxyCircuits (if relevant)
+        /// </value>
         protected Dictionary<EndPoint, uint> clientCircuits = new Dictionary<EndPoint, uint>();
-
-        //public Dictionary<uint, EndPoint> clientCircuits_reverse = new Dictionary<uint, EndPoint>();
         public Hashtable clientCircuits_reverse = Hashtable.Synchronized(new Hashtable());
-
         protected Dictionary<uint, EndPoint> proxyCircuits = new Dictionary<uint, EndPoint>();
+        
         private Socket m_socket;
         protected IPEndPoint ServerIncoming;
         protected byte[] RecvBuffer = new byte[4096];
@@ -360,7 +362,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
         {
             //Slave regions don't accept new clients
             if (m_localScene.Region_Status != RegionStatus.SlaveScene)
-            {
+            {                
+                bool foundExistingCircuit = false;
+                
                 lock (clientCircuits)
                 {
                     if (!clientCircuits.ContainsKey(epSender))  
@@ -370,20 +374,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP
                             useCircuit.CircuitCode.ID, useCircuit.CircuitCode.Code);
                         
                         clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
+                        
+                        foundExistingCircuit = true;
                     }
                 }
 
-                // This doesn't need locking as it's synchronized data
-                if (!clientCircuits_reverse.ContainsKey(useCircuit.CircuitCode.Code))
-                    clientCircuits_reverse.Add(useCircuit.CircuitCode.Code, epSender);
-
-                lock (proxyCircuits)
+                if (!foundExistingCircuit)
                 {
-                    if (!proxyCircuits.ContainsKey(useCircuit.CircuitCode.Code))
-                        proxyCircuits.Add(useCircuit.CircuitCode.Code, epProxy);
-                }
+                    // This doesn't need locking as it's synchronized data
+                    if (!clientCircuits_reverse.ContainsKey(useCircuit.CircuitCode.Code))
+                        clientCircuits_reverse.Add(useCircuit.CircuitCode.Code, epSender);
 
-                PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_circuitManager, epProxy);
+                    lock (proxyCircuits)
+                    {
+                        if (!proxyCircuits.ContainsKey(useCircuit.CircuitCode.Code))
+                            proxyCircuits.Add(useCircuit.CircuitCode.Code, epProxy);
+                    }
+
+                    PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_circuitManager, epProxy);
+                }
             }            
             
             // Ack the UseCircuitCode packet
-- 
cgit v1.1