mirror of
https://github.com/opensim/opensim.git
synced 2026-07-31 13:55:35 +08:00
Another stab at cmickeyb's patch for script GC.
Moved the Close() for the appdomain-hosted parts into a new destructor on ScriptInstance.
This commit is contained in:
@@ -119,14 +119,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
AsyncCommands = new AsyncCommandManager(ScriptEngine);
|
||||
}
|
||||
|
||||
// Object never expires
|
||||
public override Object InitializeLifetimeService()
|
||||
{
|
||||
ILease lease = (ILease)base.InitializeLifetimeService();
|
||||
|
||||
if (lease.CurrentState == LeaseState.Initial)
|
||||
{
|
||||
lease.InitialLeaseTime = TimeSpan.Zero;
|
||||
lease.InitialLeaseTime = TimeSpan.FromMinutes(1.0);
|
||||
lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
|
||||
lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
|
||||
}
|
||||
return lease;
|
||||
}
|
||||
|
||||
@@ -159,16 +159,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Never expire this object
|
||||
//
|
||||
public override Object InitializeLifetimeService()
|
||||
{
|
||||
ILease lease = (ILease)base.InitializeLifetimeService();
|
||||
|
||||
if (lease.CurrentState == LeaseState.Initial)
|
||||
{
|
||||
lease.InitialLeaseTime = TimeSpan.Zero;
|
||||
lease.InitialLeaseTime = TimeSpan.FromMinutes(1.0);
|
||||
lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
|
||||
lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
|
||||
}
|
||||
return lease;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ using log4net;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
{
|
||||
public class Executor : MarshalByRefObject
|
||||
public class Executor
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
@@ -89,26 +89,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
initEventFlags();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Make sure our object does not timeout when in AppDomain. (Called by ILease base class)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override Object InitializeLifetimeService()
|
||||
{
|
||||
//m_log.Debug("Executor: InitializeLifetimeService()");
|
||||
// return null;
|
||||
ILease lease = (ILease)base.InitializeLifetimeService();
|
||||
|
||||
if (lease.CurrentState == LeaseState.Initial)
|
||||
{
|
||||
lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1);
|
||||
// lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
|
||||
// lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
|
||||
}
|
||||
return lease;
|
||||
}
|
||||
|
||||
|
||||
public scriptEvents GetStateEventFlags(string state)
|
||||
{
|
||||
//m_log.Debug("Get event flags for " + state);
|
||||
|
||||
@@ -32,7 +32,7 @@ using LSLInteger = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
{
|
||||
public partial class ScriptBaseClass : MarshalByRefObject
|
||||
public partial class ScriptBaseClass
|
||||
{
|
||||
// LSL CONSTANTS
|
||||
public static readonly LSLInteger TRUE = new LSLInteger(1);
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Runtime.Remoting;
|
||||
using System.Runtime.Remoting.Lifetime;
|
||||
using System.Security.Permissions;
|
||||
using System.Threading;
|
||||
@@ -34,26 +35,23 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||
using OpenSim.Region.ScriptEngine.Shared;
|
||||
using OpenSim.Region.ScriptEngine.Shared.Api.Runtime;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
{
|
||||
public partial class ScriptBaseClass : MarshalByRefObject, IScript
|
||||
{
|
||||
private Dictionary<string, MethodInfo> inits = new Dictionary<string, MethodInfo>();
|
||||
private ScriptSponsor m_sponser;
|
||||
|
||||
// Object expires if we don't keep it alive
|
||||
// sponsor will be added on object load
|
||||
[SecurityPermissionAttribute(SecurityAction.Demand,
|
||||
Flags = SecurityPermissionFlag.Infrastructure)]
|
||||
public override Object InitializeLifetimeService()
|
||||
{
|
||||
ILease lease = (ILease)base.InitializeLifetimeService();
|
||||
if (lease.CurrentState == LeaseState.Initial)
|
||||
{
|
||||
lease.InitialLeaseTime = TimeSpan.Zero;
|
||||
// lease.InitialLeaseTime = TimeSpan.FromMinutes(1);
|
||||
// lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
|
||||
// lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
|
||||
lease.InitialLeaseTime = TimeSpan.FromMinutes(1.0);
|
||||
lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
|
||||
lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
|
||||
}
|
||||
return lease;
|
||||
}
|
||||
@@ -66,7 +64,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
public ScriptBaseClass()
|
||||
{
|
||||
m_Executor = new Executor(this);
|
||||
@@ -81,6 +78,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
inits[type] = mi;
|
||||
}
|
||||
}
|
||||
|
||||
m_sponser = new ScriptSponsor();
|
||||
}
|
||||
|
||||
private Executor m_Executor = null;
|
||||
@@ -112,6 +111,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
if (!inits.ContainsKey(api))
|
||||
return;
|
||||
|
||||
ILease lease = (ILease)RemotingServices.GetLifetimeService(data as MarshalByRefObject);
|
||||
lease.Register(m_sponser);
|
||||
|
||||
MethodInfo mi = inits[api];
|
||||
|
||||
Object[] args = new Object[1];
|
||||
@@ -122,6 +124,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
m_InitialValues = GetVars();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
m_sponser.Close();
|
||||
}
|
||||
|
||||
public Dictionary<string, object> GetVars()
|
||||
{
|
||||
Dictionary<string, object> vars = new Dictionary<string, object>();
|
||||
|
||||
@@ -32,15 +32,19 @@ using System.Text;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.Api.Runtime
|
||||
{
|
||||
[Serializable]
|
||||
public class ScriptSponsor : MarshalByRefObject, ISponsor
|
||||
{
|
||||
// In theory: I execute, therefore I am.
|
||||
// If GC collects this class then sponsorship will expire
|
||||
private bool m_closed = false;
|
||||
|
||||
public TimeSpan Renewal(ILease lease)
|
||||
{
|
||||
return TimeSpan.FromMinutes(2);
|
||||
if (!m_closed)
|
||||
return lease.InitialLeaseTime;
|
||||
return TimeSpan.FromTicks(0);
|
||||
}
|
||||
|
||||
public void Close() { m_closed = true; }
|
||||
|
||||
#if DEBUG
|
||||
// For tracing GC while debugging
|
||||
public static bool GCDummy = false;
|
||||
|
||||
@@ -96,7 +96,7 @@ 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 Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>
|
||||
m_LineMap;
|
||||
|
||||
@@ -261,12 +261,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)
|
||||
{
|
||||
@@ -368,6 +365,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||
}
|
||||
}
|
||||
|
||||
~ScriptInstance()
|
||||
{
|
||||
m_Script.Close();
|
||||
m_ScriptSponsor.Close();
|
||||
ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
|
||||
lease.Unregister(m_ScriptSponsor);
|
||||
}
|
||||
|
||||
public void Init()
|
||||
{
|
||||
if (!m_startOnInit) return;
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user