From 91f6898b26caa8f74533dbd90478cf4103251abe Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 6 Aug 2009 22:03:20 +0100 Subject: |From: James J Greensky |Date: Wed, 5 Aug 2009 09:51:52 -0700 |Subject: [PATCH] Closed two major memory leaks for scripted objects | |Two major memory leaks for the scripted objects were fixed |- One leak had to do with remoting acrossing app domains. When a script and | its controlling agent communicate across an application boundary, it calls | functions on a stub proxy object that then invokes the remote method on | the object in the other app domain. These stub objects (two for each script) | were setup to have infinate lifetimes and were never being garbage collected. |- The second leak was the result of adding a scene object part instance method | to a scene event and never removing it. This cause the event's delegate list | to maintain a link to that object which is then never freed as the scene event | object is never destroyed. Patch applied, please direct feedback to me. Possible issue: Longtime idle scripts like vendors may fail. --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/XEngine') diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index c7673c7..ff75e2f 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -272,6 +272,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine instance.ClearQueue(); instance.Stop(0); + // Release events, timer, etc + // + instance.DestroyScriptInstance(); + // Unload scripts and app domains // Must be done explicitly because they have infinite // lifetime @@ -282,10 +286,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_DomainScripts.Remove(instance.AppDomain); UnloadAppDomain(instance.AppDomain); } - - // Release events, timer, etc - // - instance.DestroyScriptInstance(); } m_Scripts.Clear(); m_PrimObjects.Clear(); @@ -802,6 +802,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine } } + instance.RemoveState(); + instance.DestroyScriptInstance(); + m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); if (m_DomainScripts[instance.AppDomain].Count == 0) { @@ -809,9 +812,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine UnloadAppDomain(instance.AppDomain); } - instance.RemoveState(); - instance.DestroyScriptInstance(); - instance = null; ObjectRemoved handlerObjectRemoved = OnObjectRemoved; -- cgit v1.1