* Remapped the Connection shutdown path.

* This fixes a *bunch* of Mantis bugs related to the following
* -- Neighbouring simulators not appearing after relog
* -- Login to simulator only to be logged off by simulator.
* -- ThreadAbort 
* -- Unable to shutdown circuitCode: x
afrisby
Teravus Ovares 2007-12-21 16:55:03 +00:00
parent ab673a1f8d
commit a453672edb
6 changed files with 34 additions and 16 deletions

View File

@ -111,7 +111,7 @@ namespace OpenSim.Framework
if (m_clients.TryGetValue(circuits[i], out client))
{
Remove(client.CircuitCode);
client.Close();
client.Close(false);
}
}
catch (System.Exception e)

View File

@ -572,7 +572,7 @@ namespace OpenSim.Framework
void SetDebug(int newDebug);
void InPacket(Packet NewPack);
void Close();
void Close(bool ShutdownCircuit);
void Kick(string message);
void Stop();
event ViewerEffectEventHandler OnViewerEffect;

View File

@ -199,38 +199,56 @@ namespace OpenSim.Region.ClientStack
# region Client Methods
public void Close()
private void CloseCleanup()
{
// Pull Client out of Region
MainLog.Instance.Verbose("CLIENT", "Close has been called");
m_scene.RemoveClient(AgentId);
// Send the STOP packet
DisableSimulatorPacket disable = new DisableSimulatorPacket();
OutPacket(disable, ThrottleOutPacketType.Task);
// FLUSH Packets
m_packetQueue.Close();
m_packetQueue.Flush();
Thread.Sleep(2000);
// Shut down timers
m_ackTimer.Stop();
m_clientPingTimer.Stop();
// This is just to give the client a reasonable chance of
// flushing out all it's packets. There should probably
// be a better mechanism here
// We can't reach into other scenes and close the connection
// We need to do this over grid communications
m_scene.CloseAllAgents(CircuitCode);
//m_scene.CloseAllAgents(CircuitCode);
m_clientThread.Abort();
}
public void Close(bool ShutdownCircult)
{
// Pull Client out of Region
MainLog.Instance.Verbose("CLIENT", "Close has been called");
//raiseevent on the packet server to Shutdown the circuit
if (ShutdownCircult)
OnConnectionClosed(this);
CloseCleanup();
}
public void Kick(string message)
{
KickUserPacket kupack = new KickUserPacket();
@ -2214,7 +2232,7 @@ namespace OpenSim.Region.ClientStack
"ClientView.m_packetQueue.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " +
m_userEndPoint.ToString() + " - killing thread");
MainLog.Instance.Error(e.ToString());
Close();
Close(true);
}
}

View File

@ -132,7 +132,7 @@ namespace OpenSim.Region.ClientStack
public virtual void CloseClient(IClientAPI client)
{
CloseCircuit(client.CircuitCode);
client.Close();
client.Close(false);
}
}
}

View File

@ -478,7 +478,7 @@ namespace OpenSim.Region.Environment.Scenes
// Stop all client threads.
ForEachScenePresence(delegate(ScenePresence avatar)
{
avatar.ControllingClient.Close();
avatar.ControllingClient.Close(true);
});
// Stop updating the scene objects and agents.
m_heartbeatTimer.Close();
@ -1758,7 +1758,7 @@ namespace OpenSim.Region.Environment.Scenes
bool childagent = !p.Equals(null) && p.IsChildAgent;
if (controller.AgentId != godID && !childagent) // Do we really want to kick the initiator of this madness?
{
controller.Close();
controller.Close(true);
}
}
);
@ -1775,7 +1775,7 @@ namespace OpenSim.Region.Environment.Scenes
}
m_scenePresences[agentID].ControllingClient.Kick(Helpers.FieldToUTF8String(reason));
m_scenePresences[agentID].ControllingClient.Close();
m_scenePresences[agentID].ControllingClient.Close(true);
}
}
else

View File

@ -464,7 +464,7 @@ namespace SimpleApp
{
}
public void Close()
public void Close(bool ShutdownCircuit)
{
}