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 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'OpenSim/Framework') 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); + } } } } -- cgit v1.1