In PresenceDetector.OnConnectionClose(), use the IsChildAgent check already available on IClientAPI.SceneAgent rather than retrieving it again by scanning all scenes.

0.7.4.1
Justin Clark-Casey (justincc) 2012-06-12 01:23:40 +01:00
parent bab7dab4c5
commit 8c7149063b
4 changed files with 22 additions and 24 deletions

View File

@ -740,14 +740,24 @@ namespace OpenSim.Framework
/// </summary> /// </summary>
string Name { get; } string Name { get; }
/// <value> /// <summary>
/// Determines whether the client thread is doing anything or not. /// True if the client is active (sending and receiving new UDP messages). False if the client is closing.
/// </value> /// </summary>
bool IsActive { get; set; } bool IsActive { get; set; }
/// <value> /// <summary>
/// Determines whether the client is or has been removed from a given scene /// Set if the client is closing due to a logout request or because of too much time since last ack.
/// </value> /// </summary>
/// <remarks>
/// Do not use this flag if you want to know if the client is closing, since it will not be set in other
/// circumstances (e.g. if a child agent is closed or the agent is kicked off the simulator). Use IsActive
/// instead.
///
/// Only set for root agents.
///
/// TODO: Too much time since last ack should probably be a separate property, or possibly part of a state
/// machine.
/// </remarks>
bool IsLoggingOut { get; set; } bool IsLoggingOut { get; set; }
bool SendLogoutPacketWhenClosing { set; } bool SendLogoutPacketWhenClosing { set; }

View File

@ -490,12 +490,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// </summary> /// </summary>
public void Close() public void Close()
{ {
IsActive = false;
m_log.DebugFormat( m_log.DebugFormat(
"[CLIENT]: Close has been called for {0} attached to scene {1}", "[CLIENT]: Close has been called for {0} attached to scene {1}",
Name, m_scene.RegionInfo.RegionName); Name, m_scene.RegionInfo.RegionName);
IsActive = false;
// Shutdown the image manager // Shutdown the image manager
ImageManager.Close(); ImageManager.Close();

View File

@ -64,7 +64,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence
scene.EventManager.OnNewClient -= OnNewClient; scene.EventManager.OnNewClient -= OnNewClient;
m_PresenceService.LogoutRegionAgents(scene.RegionInfo.RegionID); m_PresenceService.LogoutRegionAgents(scene.RegionInfo.RegionID);
} }
public void OnMakeRootAgent(ScenePresence sp) public void OnMakeRootAgent(ScenePresence sp)
@ -80,18 +79,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence
public void OnConnectionClose(IClientAPI client) public void OnConnectionClose(IClientAPI client)
{ {
if (client.IsLoggingOut) if (client.IsLoggingOut && !client.SceneAgent.IsChildAgent)
{ {
object sp = null;
if (client.Scene.TryGetScenePresence(client.AgentId, out sp))
{
if (sp is ScenePresence)
{
if (((ScenePresence)sp).IsChildAgent)
return;
}
}
// m_log.DebugFormat("[PRESENCE DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); // m_log.DebugFormat("[PRESENCE DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName);
m_PresenceService.LogoutAgent(client.SessionId); m_PresenceService.LogoutAgent(client.SessionId);
} }

View File

@ -3463,10 +3463,9 @@ namespace OpenSim.Region.Framework.Scenes
// Or the same user is trying to be root twice here, won't work. // Or the same user is trying to be root twice here, won't work.
// Kill it. // Kill it.
m_log.DebugFormat( m_log.DebugFormat(
"[SCENE]: Zombie scene presence detected for {0} in {1}", "[SCENE]: Zombie scene presence detected for {0} {1} in {2}",
agent.AgentID, sp.Name, sp.UUID, RegionInfo.RegionName);
RegionInfo.RegionName
);
sp.ControllingClient.Close(); sp.ControllingClient.Close();
sp = null; sp = null;
} }