From 1b5c41c14ad11325be249ea1cce3c65d4d6a89be Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Wed, 16 Jan 2013 00:12:40 +0000 Subject: Implement co-operative script termination if termination comes during a script wait event (llSleep(), etc.) This makes use of EventWaitHandles since various web references indicate that Thread.Interrupt() can also cause runtime instability. If co-op termination is enabled, then termination sets the wait handle instead of waiting for a timeout before possibly aborting the thread. This allows the script to cleanly terminate if it's in a llSleep/LL function delay or the next time it enters such a wait without any timeout period. Co-op termination is not yet testable since checking for termination request within loops that never trigger a wait is not yet implemented. --- OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs') diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index 9de2d72..38fff52 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs @@ -28,6 +28,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Threading; using OpenMetaverse; using log4net; using OpenSim.Framework; @@ -181,6 +182,18 @@ namespace OpenSim.Region.ScriptEngine.Interfaces void Resume(); /// + /// If true then scripts should look to terminate their threads in co-operation with the script engine rather + /// than through Thread.Abort() + /// + bool CoopTermination { get; } + + /// + /// Used for script sleeps when we are using co-operative script termination. + /// + /// null if CoopTermination is not active + EventWaitHandle CoopSleepHandle { get; } + + /// /// Process the next event queued for this script instance. /// /// -- cgit v1.1