mirror of
https://github.com/opensim/opensim.git
synced 2026-06-30 02:57:02 +08:00
|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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user