Instead of retrieving the known client again in LLUDPServer.RemoveClient(), check the IsLoggingOut flag instead.
This is slightly better thread-race wise0.7.3-extended
parent
2d16d14ef1
commit
27a7ba3e6a
|
@ -560,7 +560,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
{
|
||||
m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID);
|
||||
StatsManager.SimExtraStats.AddAbnormalClientThreadTermination();
|
||||
RemoveClient(udpClient);
|
||||
RemoveClient(client);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -1110,11 +1110,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
return client;
|
||||
}
|
||||
|
||||
private void RemoveClient(LLUDPClient udpClient)
|
||||
{
|
||||
// Remove this client from the scene
|
||||
IClientAPI client;
|
||||
if (m_scene.TryGetClient(udpClient.AgentID, out client))
|
||||
private void RemoveClient(IClientAPI client)
|
||||
{
|
||||
// We must set IsLoggingOut synchronously so that we can stop the packet loop reinvoking this method.
|
||||
client.IsLoggingOut = true;
|
||||
|
@ -1124,13 +1120,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
// This is the same as processing as the async process of a logout request.
|
||||
Util.FireAndForget(o => client.Close());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat(
|
||||
"[LLUDPSERVER]: Tried to remove client with id {0} but not such client in {1}",
|
||||
udpClient.AgentID, m_scene.RegionInfo.RegionName);
|
||||
}
|
||||
}
|
||||
|
||||
private void IncomingPacketHandler()
|
||||
{
|
||||
|
@ -1443,8 +1432,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
protected void LogoutHandler(IClientAPI client)
|
||||
{
|
||||
client.SendLogoutPacket();
|
||||
if (client.IsActive)
|
||||
RemoveClient(((LLClientView)client).UDPClient);
|
||||
if (!client.IsLoggingOut)
|
||||
RemoveClient(client);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue