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. --- .../ScriptEngine/Shared/Instance/ScriptInstance.cs | 25 ++++++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs') diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 8168300..6d62249 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -96,7 +96,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance private string m_CurrentState = String.Empty; private UUID m_RegionID = UUID.Zero; - //private ISponsor m_ScriptSponsor; + private ScriptSponsor m_ScriptSponsor; + private bool m_destroyed = false; private Dictionary, KeyValuePair> m_LineMap; @@ -261,12 +262,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance Path.GetFileNameWithoutExtension(assembly), "SecondLife.Script"); - // Add a sponsor to the script -// ISponsor scriptSponsor = new ScriptSponsor(); -// ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as MarshalByRefObject); -// lease.Register(scriptSponsor); - //m_ScriptSponsor = scriptSponsor; - + m_ScriptSponsor = new ScriptSponsor(); + ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); + lease.Register(m_ScriptSponsor); } catch (Exception) { @@ -449,6 +447,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance { ReleaseControls(); AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID); + + m_Script.Close(); + m_ScriptSponsor.Close(); + ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); + lease.Unregister(m_ScriptSponsor); + + m_destroyed = true; } public void RemoveState() @@ -884,6 +889,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public void SaveState(string assembly) { + + // If we're currently in an event, just tell it to save upon return // if (m_InEvent) @@ -892,6 +899,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance return; } + // Data may not be available as the script has already been destroyed + if (m_destroyed == true) + return; + PluginData = AsyncCommandManager.GetSerializationData(m_Engine, m_ItemID); string xml = ScriptSerializer.Serialize(this); -- cgit v1.1