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