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
From d06c85ea77f76f4d915081ed6b314d66d6d38fbf Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 13 Jul 2013 00:29:07 +0100
Subject: Reinsert PhysicsActor variable back into
SOP.SubscribeForCollisionEvents() in order to avoid a race condition.
A separate PhysicsActor variable is used in case some other thread removes the PhysicsActor whilst this code is executing.
If this is now impossible please revert - just adding this now whilst I remember.
Also makes method comment into proper method doc.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 830fe31..eb3af42 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4272,10 +4272,14 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat("[SCENE OBJECT PART]: Updated PrimFlags on {0} {1} to {2}", Name, LocalId, Flags);
}
- // Subscribe for physics collision events if needed for scripts and sounds
+ ///
+ /// Subscribe for physics collision events if needed for scripts and sounds
+ ///
public void SubscribeForCollisionEvents()
{
- if (PhysActor != null)
+ PhysicsActor pa = PhysActor;
+
+ if (pa != null)
{
if (
((AggregateScriptEvents & scriptEvents.collision) != 0) ||
@@ -4293,20 +4297,20 @@ namespace OpenSim.Region.Framework.Scenes
(CollisionSound != UUID.Zero)
)
{
- if (!PhysActor.SubscribedEvents())
+ if (!pa.SubscribedEvents())
{
// If not already subscribed for event, set up for a collision event.
- PhysActor.OnCollisionUpdate += PhysicsCollision;
- PhysActor.SubscribeEvents(1000);
+ pa.OnCollisionUpdate += PhysicsCollision;
+ pa.SubscribeEvents(1000);
}
}
else
{
// There is no need to be subscribed to collisions so, if subscribed, remove subscription
- if (PhysActor.SubscribedEvents())
+ if (pa.SubscribedEvents())
{
- PhysActor.OnCollisionUpdate -= PhysicsCollision;
- PhysActor.UnSubscribeEvents();
+ pa.OnCollisionUpdate -= PhysicsCollision;
+ pa.UnSubscribeEvents();
}
}
}
--
cgit v1.1