From 4ee8d8a813f6ee164fb361fbf6c26384b668bd1a Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 7 Aug 2009 20:43:23 +0100
Subject: Another stab at cmickeyb's patch for script GC. Moved the Close() for
the appdomain-hosted parts into a new destructor on ScriptInstance.
---
.../Shared/Api/Implementation/LSL_Api.cs | 5 +++--
.../Shared/Api/Implementation/OSSL_Api.cs | 7 +++---
.../ScriptEngine/Shared/Api/Runtime/Executor.cs | 22 +------------------
.../Shared/Api/Runtime/LSL_Constants.cs | 2 +-
.../ScriptEngine/Shared/Api/Runtime/ScriptBase.cs | 25 ++++++++++++++--------
.../Shared/Api/Runtime/ScriptSponsor.cs | 12 +++++++----
6 files changed, 32 insertions(+), 41 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared/Api')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index bc36fda..5f9b09b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -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;
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 967b835..bf86eeb 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -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;
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
index 2501752..7f67599 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
@@ -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();
}
- ///
- /// Make sure our object does not timeout when in AppDomain. (Called by ILease base class)
- ///
- ///
- 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);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 9068634..753ca55 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -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);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
index 964fe4c..d119a77 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
@@ -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 inits = new Dictionary();
+ 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 GetVars()
{
Dictionary vars = new Dictionary();
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs
index a2da14e..977ac30 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs
@@ -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;
--
cgit v1.1