From d0b218f667bfd796257634e3b352ca195d7d02b2 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Mon, 18 Feb 2008 21:24:34 +0000 Subject: Committing ahzz's patch #619 - Description: Patch provided by Openlifegrid.com Adds locks around clientCircuits and clientCircuits_reverse Adds existance check on adding to clientCircuits for clients resending UseCircuit packet. Adds locks around Clientmanager.m_clients for add/remove/tryGet calls --- OpenSim/Framework/ClientManager.cs | 33 +++++++++++++++++++++++--------- OpenSim/Region/ClientStack/UDPServer.cs | 34 +++++++++++++++++++++++---------- 2 files changed, 48 insertions(+), 19 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs index 51ebc9b..3df883d 100644 --- a/OpenSim/Framework/ClientManager.cs +++ b/OpenSim/Framework/ClientManager.cs @@ -72,20 +72,28 @@ namespace OpenSim.Framework public void Remove(uint id) { //m_log.InfoFormat("[CLIENT]: Removing client with code {0}, current count {1}", id, m_clients.Count); - m_clients.Remove(id); + lock (m_clients) + { + m_clients.Remove(id); + } m_log.InfoFormat("[CLIENT]: Removed client with code {0}, new client count {1}", id, m_clients.Count); } public void Add(uint id, IClientAPI client) { - m_clients.Add(id, client); + lock (m_clients) + { + m_clients.Add(id, client); + } } public void InPacket(uint circuitCode, Packet packet) { IClientAPI client; - - if (m_clients.TryGetValue(circuitCode, out client)) + bool tryGetRet = false; + lock (m_clients) + tryGetRet = m_clients.TryGetValue(circuitCode, out client); + if(tryGetRet) { client.InPacket(packet); } @@ -94,8 +102,10 @@ namespace OpenSim.Framework public void CloseAllAgents(uint circuitCode) { IClientAPI client; - - if (m_clients.TryGetValue(circuitCode, out client)) + bool tryGetRet = false; + lock (m_clients) + tryGetRet = m_clients.TryGetValue(circuitCode, out client); + if (tryGetRet) { CloseAllCircuits(client.AgentId); } @@ -111,8 +121,10 @@ namespace OpenSim.Framework IClientAPI client; try { - - if (m_clients.TryGetValue(circuits[i], out client)) + bool tryGetRet = false; + lock (m_clients) + tryGetRet = m_clients.TryGetValue(circuits[i], out client); + if(tryGetRet) { Remove(client.CircuitCode); client.Close(false); @@ -176,7 +188,10 @@ namespace OpenSim.Framework public bool TryGetClient(uint circuitId, out IClientAPI user) { - return m_clients.TryGetValue(circuitId, out user); + lock (m_clients) + { + return m_clients.TryGetValue(circuitId, out user); + } } } } diff --git a/OpenSim/Region/ClientStack/UDPServer.cs b/OpenSim/Region/ClientStack/UDPServer.cs index 7b32490..1997453 100644 --- a/OpenSim/Region/ClientStack/UDPServer.cs +++ b/OpenSim/Region/ClientStack/UDPServer.cs @@ -311,9 +311,12 @@ namespace OpenSim.Region.ClientStack private void CloseEndPoint(EndPoint sender) { uint circuit; - if (clientCircuits.TryGetValue(sender, out circuit)) + lock (clientCircuits) { - m_packetServer.CloseCircuit(circuit); + if (clientCircuits.TryGetValue(sender, out circuit)) + { + m_packetServer.CloseCircuit(circuit); + } } } @@ -322,12 +325,17 @@ namespace OpenSim.Region.ClientStack UseCircuitCodePacket useCircuit = (UseCircuitCodePacket) packet; lock (clientCircuits) { - clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); + if (!clientCircuits.ContainsKey(epSender)) + clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); + else + m_log.Error("[UDPSERVER]: clientCircuits already contans entry for user " + useCircuit.CircuitCode.Code.ToString() + ". NOT adding."); } lock (clientCircuits_reverse) { if (!clientCircuits_reverse.ContainsKey(useCircuit.CircuitCode.Code)) - clientCircuits_reverse.Add(useCircuit.CircuitCode.Code, epSender); + clientCircuits_reverse.Add(useCircuit.CircuitCode.Code, epSender); + else + m_log.Error("[UDPSERVER]: clientCurcuits_reverse already contains entry for user " + useCircuit.CircuitCode.Code.ToString() + ". NOT adding."); } PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_authenticateSessionsClass); @@ -380,22 +388,28 @@ namespace OpenSim.Region.ClientStack { // find the endpoint for this circuit EndPoint sendto = null; - if (clientCircuits_reverse.TryGetValue(circuitcode, out sendto)) + lock (clientCircuits_reverse) { - //we found the endpoint so send the packet to it - Server.SendTo(buffer, size, flags, sendto); + if (clientCircuits_reverse.TryGetValue(circuitcode, out sendto)) + { + //we found the endpoint so send the packet to it + Server.SendTo(buffer, size, flags, sendto); + } } } public virtual void RemoveClientCircuit(uint circuitcode) { EndPoint sendto = null; - if (clientCircuits_reverse.TryGetValue(circuitcode, out sendto)) + lock (clientCircuits_reverse) { - clientCircuits.Remove(sendto); + if (clientCircuits_reverse.TryGetValue(circuitcode, out sendto)) + { + clientCircuits.Remove(sendto); - clientCircuits_reverse.Remove(circuitcode); + clientCircuits_reverse.Remove(circuitcode); + } } } } -- cgit v1.1