From 22c28a026090fca174582ac995435db99f692b32 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 30 Apr 2020 03:37:28 +0100 Subject: [PATCH] make Caps IDisposable --- OpenSim/Capabilities/Caps.cs | 19 ++++++++++++++++++- .../Linden/Caps/ObjectCaps/ObjectAdd.cs | 2 +- .../Framework/Caps/CapabilitiesModule.cs | 8 ++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/OpenSim/Capabilities/Caps.cs b/OpenSim/Capabilities/Caps.cs index b43c1f57a9..3facc0fd58 100644 --- a/OpenSim/Capabilities/Caps.cs +++ b/OpenSim/Capabilities/Caps.cs @@ -50,7 +50,7 @@ namespace OpenSim.Framework.Capabilities /// public delegate IClientAPI GetClientDelegate(UUID agentID); - public class Caps + public class Caps : IDisposable { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -164,6 +164,23 @@ namespace OpenSim.Framework.Capabilities m_capsActive = null; } } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + public void Dispose(bool disposing) + { + Flags = CapsFlags.None; + DeregisterHandlers(); + if (m_capsActive != null) + { + m_capsActive.Dispose(); + m_capsActive = null; + } + } /// /// Register a handler. This allows modules to register handlers. diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs index 86062b3fe8..e10db8d5df 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs @@ -92,7 +92,7 @@ namespace OpenSim.Region.ClientStack.Linden { // m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/"); - caps.RegisterSimpleHandler("ObjectAdd", new SimpleOSDMapHandler("POST", "/" + UUID.Random().ToString(), + caps.RegisterSimpleHandler("ObjectAdd", new SimpleOSDMapHandler("POST", "/" + UUID.Random(), delegate (IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap map) { ProcessAdd(httpRequest, httpResponse, map, agentID); diff --git a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs index 9f3273259b..b07ca980b2 100644 --- a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs @@ -191,11 +191,11 @@ namespace OpenSim.Region.CoreModules.Framework lock (m_capsObjects) { - if (m_capsObjects.ContainsKey(circuitCode)) + if (m_capsObjects.TryGetValue(circuitCode, out Caps cp)) { - m_capsObjects[circuitCode].DeregisterHandlers(); - m_scene.EventManager.TriggerOnDeregisterCaps(agentId, m_capsObjects[circuitCode]); + m_scene.EventManager.TriggerOnDeregisterCaps(agentId, cp); m_capsObjects.Remove(circuitCode); + cp.Dispose(); } else { @@ -203,9 +203,9 @@ namespace OpenSim.Region.CoreModules.Framework { if (kvp.Value.AgentID == agentId) { - kvp.Value.DeregisterHandlers(); m_scene.EventManager.TriggerOnDeregisterCaps(agentId, kvp.Value); m_capsObjects.Remove(kvp.Key); + kvp.Value.Dispose(); return; } }