diff options
author | Justin Clark-Casey (justincc) | 2013-02-12 21:34:12 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2013-02-12 21:34:12 +0000 |
commit | a82bd5678ec14ea45f7ddcf54e4dd0af43b64c8c (patch) | |
tree | f54b50be843f78eb225c6b517913db89c2058d57 | |
parent | Re-enable subtest for single quoted token in TestJsonSetValueJson() (diff) | |
download | opensim-SC_OLD-a82bd5678ec14ea45f7ddcf54e4dd0af43b64c8c.zip opensim-SC_OLD-a82bd5678ec14ea45f7ddcf54e4dd0af43b64c8c.tar.gz opensim-SC_OLD-a82bd5678ec14ea45f7ddcf54e4dd0af43b64c8c.tar.bz2 opensim-SC_OLD-a82bd5678ec14ea45f7ddcf54e4dd0af43b64c8c.tar.xz |
Use an integer when specifying the XWorkItem wait rather than a TimeSpan to avoid a Windows casting issue in SmartThreadPool for large TimeSpans.
TimeSpan.Milliseconds is an int64. However, STP casts this to an int (32-bit).
If TimeSpan.MaxValue is given then the casting results in an invalid value for the SDK WaitHandle.WaitAll() call.
This was causing the co-op script termination regression tests to fail on Windows but not Mono 2.10.8 (which is perhaps not strict in the negative values that it accepts).
Solution here is to use the int millisecondsTimeout STP call rather than the TimeSpan one.
This also allows us to more clearly specify Timeout.Infinite rather than TimeSpan.MaxValue
Thanks to Teravus for this spot.
Diffstat (limited to '')
3 files changed, 13 insertions, 4 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index f68612c..35ae44c 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -52,7 +52,12 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
52 | { | 52 | { |
53 | bool Cancel(); | 53 | bool Cancel(); |
54 | void Abort(); | 54 | void Abort(); |
55 | bool Wait(TimeSpan t); | 55 | |
56 | /// <summary> | ||
57 | /// Wait for the work item to complete. | ||
58 | /// </summary> | ||
59 | /// <param name='t'>The number of milliseconds to wait. Must be >= -1 (Timeout.Infinite).</param> | ||
60 | bool Wait(int t); | ||
56 | } | 61 | } |
57 | 62 | ||
58 | /// <summary> | 63 | /// <summary> |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 669cc37..bf19a42 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 | |||
595 | if (!m_coopTermination) | 595 | if (!m_coopTermination) |
596 | { | 596 | { |
597 | // If we're not co-operative terminating then try and wait for the event to complete before stopping | 597 | // If we're not co-operative terminating then try and wait for the event to complete before stopping |
598 | if (workItem.Wait(new TimeSpan((long)timeout * 100000))) | 598 | if (workItem.Wait(timeout)) |
599 | return true; | 599 | return true; |
600 | } | 600 | } |
601 | else | 601 | else |
@@ -610,7 +610,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
610 | 610 | ||
611 | // For now, we will wait forever since the event should always cleanly terminate once LSL loop | 611 | // For now, we will wait forever since the event should always cleanly terminate once LSL loop |
612 | // checking is implemented. May want to allow a shorter timeout option later. | 612 | // checking is implemented. May want to allow a shorter timeout option later. |
613 | if (workItem.Wait(TimeSpan.MaxValue)) | 613 | if (workItem.Wait(Timeout.Infinite)) |
614 | { | 614 | { |
615 | if (DebugLevel >= 1) | 615 | if (DebugLevel >= 1) |
616 | m_log.DebugFormat( | 616 | m_log.DebugFormat( |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs index 2ac5c31..8dd7677 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs | |||
@@ -57,8 +57,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
57 | wr.Abort(); | 57 | wr.Abort(); |
58 | } | 58 | } |
59 | 59 | ||
60 | public bool Wait(TimeSpan t) | 60 | public bool Wait(int t) |
61 | { | 61 | { |
62 | // We use the integer version of WaitAll because the current version of SmartThreadPool has a bug with the | ||
63 | // TimeSpan version. The number of milliseconds in TimeSpan is an int64 so when STP casts it down to an | ||
64 | // int (32-bit) we can end up with bad values. This occurs on Windows though curious not on Mono 2.10.8 | ||
65 | // (or very likely other versions of Mono at least up until 3.0.3). | ||
62 | return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); | 66 | return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); |
63 | } | 67 | } |
64 | } | 68 | } |