Fix memory leak where removing an NPC did not remove its circuits.

This was because we were removing by circuitcode where NPCs have no code.
Now removing by agent ID instead.
This commit also fixes the "show circuits" console command to work properly where the circuit has no associated IP address.
0.7.4-extended
Justin Clark-Casey (justincc) 2012-10-29 23:22:40 +00:00
parent a4b64d4854
commit bffdf20721
3 changed files with 15 additions and 3 deletions

View File

@ -1109,7 +1109,7 @@ namespace OpenSim
aCircuit.Name, aCircuit.Name,
aCircuit.child ? "child" : "root", aCircuit.child ? "child" : "root",
aCircuit.circuitcode.ToString(), aCircuit.circuitcode.ToString(),
aCircuit.IPAddress.ToString(), aCircuit.IPAddress != null ? aCircuit.IPAddress.ToString() : "not set",
aCircuit.Viewer); aCircuit.Viewer);
}); });

View File

@ -3333,9 +3333,10 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
// We remove the acd up here to avoid later raec conditions if two RemoveClient() calls occurred // We remove the acd up here to avoid later race conditions if two RemoveClient() calls occurred
// simultaneously. // simultaneously.
m_authenticateHandler.RemoveCircuit(acd.circuitcode); // We also need to remove by agent ID since NPCs will have no circuit code.
m_authenticateHandler.RemoveCircuit(agentID);
} }
} }

View File

@ -117,6 +117,12 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
Assert.That(npc, Is.Not.Null); Assert.That(npc, Is.Not.Null);
Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId)); Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId));
Assert.That(m_umMod.GetUserName(npc.UUID), Is.EqualTo(string.Format("{0} {1}", npc.Firstname, npc.Lastname))); Assert.That(m_umMod.GetUserName(npc.UUID), Is.EqualTo(string.Format("{0} {1}", npc.Firstname, npc.Lastname)));
IClientAPI client;
Assert.That(m_scene.TryGetClient(npcId, out client), Is.True);
// Have to account for both SP and NPC.
Assert.That(m_scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(2));
} }
[Test] [Test]
@ -136,6 +142,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
ScenePresence deletedNpc = m_scene.GetScenePresence(npcId); ScenePresence deletedNpc = m_scene.GetScenePresence(npcId);
Assert.That(deletedNpc, Is.Null); Assert.That(deletedNpc, Is.Null);
IClientAPI client;
Assert.That(m_scene.TryGetClient(npcId, out client), Is.False);
// Have to account for SP still present.
Assert.That(m_scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1));
} }
[Test] [Test]