|From: James J Greensky <jame.j.greensky@intel.com>

|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.
This commit is contained in:
Melanie
2009-08-06 22:03:20 +01:00
parent eb9d584ee0
commit 91f6898b26
11 changed files with 73 additions and 68 deletions

View File

@@ -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<int, int>, KeyValuePair<int, int>>
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);