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
ThreadPoolClientBranch
Teravus Ovares 2008-02-18 21:24:34 +00:00
parent 056f3dca2c
commit d0b218f667
2 changed files with 48 additions and 19 deletions

View File

@ -72,20 +72,28 @@ namespace OpenSim.Framework
public void Remove(uint id) public void Remove(uint id)
{ {
//m_log.InfoFormat("[CLIENT]: Removing client with code {0}, current count {1}", id, m_clients.Count); //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); m_log.InfoFormat("[CLIENT]: Removed client with code {0}, new client count {1}", id, m_clients.Count);
} }
public void Add(uint id, IClientAPI client) 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) public void InPacket(uint circuitCode, Packet packet)
{ {
IClientAPI client; IClientAPI client;
bool tryGetRet = false;
if (m_clients.TryGetValue(circuitCode, out client)) lock (m_clients)
tryGetRet = m_clients.TryGetValue(circuitCode, out client);
if(tryGetRet)
{ {
client.InPacket(packet); client.InPacket(packet);
} }
@ -94,8 +102,10 @@ namespace OpenSim.Framework
public void CloseAllAgents(uint circuitCode) public void CloseAllAgents(uint circuitCode)
{ {
IClientAPI client; IClientAPI client;
bool tryGetRet = false;
if (m_clients.TryGetValue(circuitCode, out client)) lock (m_clients)
tryGetRet = m_clients.TryGetValue(circuitCode, out client);
if (tryGetRet)
{ {
CloseAllCircuits(client.AgentId); CloseAllCircuits(client.AgentId);
} }
@ -111,8 +121,10 @@ namespace OpenSim.Framework
IClientAPI client; IClientAPI client;
try try
{ {
bool tryGetRet = false;
if (m_clients.TryGetValue(circuits[i], out client)) lock (m_clients)
tryGetRet = m_clients.TryGetValue(circuits[i], out client);
if(tryGetRet)
{ {
Remove(client.CircuitCode); Remove(client.CircuitCode);
client.Close(false); client.Close(false);
@ -176,7 +188,10 @@ namespace OpenSim.Framework
public bool TryGetClient(uint circuitId, out IClientAPI user) 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);
}
} }
} }
} }

View File

@ -311,9 +311,12 @@ namespace OpenSim.Region.ClientStack
private void CloseEndPoint(EndPoint sender) private void CloseEndPoint(EndPoint sender)
{ {
uint circuit; 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; UseCircuitCodePacket useCircuit = (UseCircuitCodePacket) packet;
lock (clientCircuits) 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) lock (clientCircuits_reverse)
{ {
if (!clientCircuits_reverse.ContainsKey(useCircuit.CircuitCode.Code)) 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); PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_authenticateSessionsClass);
@ -380,22 +388,28 @@ namespace OpenSim.Region.ClientStack
{ {
// find the endpoint for this circuit // find the endpoint for this circuit
EndPoint sendto = null; EndPoint sendto = null;
if (clientCircuits_reverse.TryGetValue(circuitcode, out sendto)) lock (clientCircuits_reverse)
{ {
//we found the endpoint so send the packet to it if (clientCircuits_reverse.TryGetValue(circuitcode, out sendto))
Server.SendTo(buffer, size, flags, sendto); {
//we found the endpoint so send the packet to it
Server.SendTo(buffer, size, flags, sendto);
}
} }
} }
public virtual void RemoveClientCircuit(uint circuitcode) public virtual void RemoveClientCircuit(uint circuitcode)
{ {
EndPoint sendto = null; 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);
}
} }
} }
} }