diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index f68612c15e..35ae44c315 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -52,7 +52,12 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
{
bool Cancel();
void Abort();
- bool Wait(TimeSpan t);
+
+ ///
+ /// Wait for the work item to complete.
+ ///
+ /// The number of milliseconds to wait. Must be >= -1 (Timeout.Infinite).
+ bool Wait(int t);
}
///
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 669cc3761c..bf19a42868 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -595,7 +595,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (!m_coopTermination)
{
// If we're not co-operative terminating then try and wait for the event to complete before stopping
- if (workItem.Wait(new TimeSpan((long)timeout * 100000)))
+ if (workItem.Wait(timeout))
return true;
}
else
@@ -610,7 +610,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// For now, we will wait forever since the event should always cleanly terminate once LSL loop
// checking is implemented. May want to allow a shorter timeout option later.
- if (workItem.Wait(TimeSpan.MaxValue))
+ if (workItem.Wait(Timeout.Infinite))
{
if (DebugLevel >= 1)
m_log.DebugFormat(
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs
index 2ac5c315af..8dd7677d7f 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs
@@ -57,8 +57,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
wr.Abort();
}
- public bool Wait(TimeSpan t)
+ public bool Wait(int t)
{
+ // We use the integer version of WaitAll because the current version of SmartThreadPool has a bug with the
+ // TimeSpan version. The number of milliseconds in TimeSpan is an int64 so when STP casts it down to an
+ // int (32-bit) we can end up with bad values. This occurs on Windows though curious not on Mono 2.10.8
+ // (or very likely other versions of Mono at least up until 3.0.3).
return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false);
}
}