From 3d118fb580ea0a5e9d9b23f5f876fca80cd17d0e Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 12 Jul 2013 18:53:27 +0100
Subject: In co-op termination, extend EventWaitHandle to give this an
indefinite lifetime in order to avoid a later RemotingException if scripts
are being loaded into their own domains.
This is necessary because XEngineScriptBase now retains a reference to an EventWaitHandle when co-op termination is active.
Aims to address http://opensimulator.org/mantis/view.php?id=6634
---
.../ScriptEngine/Shared/Instance/ScriptInstance.cs | 23 ++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 887a317..229180f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -241,7 +241,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op")
{
m_coopTermination = true;
- m_coopSleepHandle = new AutoResetEvent(false);
+ m_coopSleepHandle = new XEngineEventWaitHandle(false, EventResetMode.AutoReset);
}
}
@@ -1201,4 +1201,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
Suspended = false;
}
}
-}
+
+ ///
+ /// Xengine event wait handle.
+ ///
+ ///
+ /// This class exists becase XEngineScriptBase gets a reference to this wait handle. We need to make sure that
+ /// when scripts are running in different AppDomains the lease does not expire.
+ /// FIXME: Like LSL_Api, etc., this effectively leaks memory since the GC will never collect it. To avoid this,
+ /// proper remoting sponsorship needs to be implemented across the board.
+ ///
+ public class XEngineEventWaitHandle : EventWaitHandle
+ {
+ public XEngineEventWaitHandle(bool initialState, EventResetMode mode) : base(initialState, mode) {}
+
+ public override Object InitializeLifetimeService()
+ {
+ return null;
+ }
+ }
+}
\ No newline at end of file
--
cgit v1.1