From f8d8366bfa6f048107d22b4b73af22803810be81 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 7 Aug 2009 03:04:06 +0100
Subject: Revert the XEngine memleak patch, it causes premature GC. This
matches behavior seen with an earlier attempt to do this, apparently the
sponsor mechanism does't work in Mono
---
.../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 ++++-------
.../ScriptEngine/Shared/Instance/ScriptInstance.cs | 25 ++++++----------------
7 files changed, 48 insertions(+), 50 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine/Shared')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5f9b09b..bc36fda 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -119,15 +119,14 @@ 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.FromMinutes(1.0);
- lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
- lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
+ lease.InitialLeaseTime = TimeSpan.Zero;
}
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 b447cfb..7c878b8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -159,15 +159,16 @@ 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.FromMinutes(1.0);
- lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
- lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
+ lease.InitialLeaseTime = TimeSpan.Zero;
}
return lease;
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
index 7f67599..2501752 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
+ public class Executor : MarshalByRefObject
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -89,6 +89,26 @@ 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 753ca55..9068634 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
+ public partial class ScriptBaseClass : MarshalByRefObject
{
// 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 d119a77..964fe4c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
@@ -26,7 +26,6 @@
*/
using System;
-using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
using System.Security.Permissions;
using System.Threading;
@@ -35,23 +34,26 @@ 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.FromMinutes(1.0);
- lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
- lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
+ lease.InitialLeaseTime = TimeSpan.Zero;
+// lease.InitialLeaseTime = TimeSpan.FromMinutes(1);
+// lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
+// lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
}
return lease;
}
@@ -64,6 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
}
#endif
+
public ScriptBaseClass()
{
m_Executor = new Executor(this);
@@ -78,8 +81,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
inits[type] = mi;
}
}
-
- m_sponser = new ScriptSponsor();
}
private Executor m_Executor = null;
@@ -111,9 +112,6 @@ 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];
@@ -124,11 +122,6 @@ 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 977ac30..a2da14e 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs
@@ -32,19 +32,15 @@ using System.Text;
namespace OpenSim.Region.ScriptEngine.Shared.Api.Runtime
{
+ [Serializable]
public class ScriptSponsor : MarshalByRefObject, ISponsor
{
- private bool m_closed = false;
-
+ // In theory: I execute, therefore I am.
+ // If GC collects this class then sponsorship will expire
public TimeSpan Renewal(ILease lease)
{
- if (!m_closed)
- return lease.InitialLeaseTime;
- return TimeSpan.FromTicks(0);
+ return TimeSpan.FromMinutes(2);
}
-
- public void Close() { m_closed = true; }
-
#if DEBUG
// For tracing GC while debugging
public static bool GCDummy = false;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 6d62249..8168300 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -96,8 +96,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
private string m_CurrentState = String.Empty;
private UUID m_RegionID = UUID.Zero;
- private ScriptSponsor m_ScriptSponsor;
- private bool m_destroyed = false;
+ //private ISponsor m_ScriptSponsor;
private Dictionary, KeyValuePair>
m_LineMap;
@@ -262,9 +261,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
Path.GetFileNameWithoutExtension(assembly),
"SecondLife.Script");
- m_ScriptSponsor = new ScriptSponsor();
- ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
- lease.Register(m_ScriptSponsor);
+ // 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;
+
}
catch (Exception)
{
@@ -447,13 +449,6 @@ 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()
@@ -889,8 +884,6 @@ 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)
@@ -899,10 +892,6 @@ 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