diff options
author | Justin Clark-Casey (justincc) | 2013-05-01 19:01:43 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2013-05-01 19:01:43 +0100 |
commit | 206fb306a7820cf593570e35ddfa8e7c5a10e449 (patch) | |
tree | 0ef0fdf42ddc0b63224af52b62b0bad42f62e352 /OpenSim | |
parent | Fix CAPS to work like they should - do not send caps to the viewer if they're... (diff) | |
download | opensim-SC_OLD-206fb306a7820cf593570e35ddfa8e7c5a10e449.zip opensim-SC_OLD-206fb306a7820cf593570e35ddfa8e7c5a10e449.tar.gz opensim-SC_OLD-206fb306a7820cf593570e35ddfa8e7c5a10e449.tar.bz2 opensim-SC_OLD-206fb306a7820cf593570e35ddfa8e7c5a10e449.tar.xz |
Update SmartThreadPool to latest version 2.2.3 with a major and minor change.
SmartThreadPool code comes from http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
This version implements thread abort (via WorkItem.Cancel(true)), threadpool naming, max thread stack, etc. so we no longer need to manually patch those.
However, two changes have been made to stock 2.2.3.
Major change: WorkItem.Cancel(bool abortExecution) in our version does not succeed if the work item was in progress and thread abort was not specified.
This is to match previous behaviour where we handle co-operative termination via another mechanism rather than checking WorkItem.IsCanceled.
Minor change: Did not add STP's StopWatch implementation as this is only used WinCE and Silverlight and causes a build clash with System.Diagnostics.StopWatch
The reason for updating is to see if this improves http://opensimulator.org/mantis/view.php?id=6557 and http://opensimulator.org/mantis/view.php?id=6586
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Framework/Util.cs | 20 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 9 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs | 6 |
5 files changed, 22 insertions, 19 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index bde4673..a3602e9 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -1840,7 +1840,7 @@ namespace OpenSim.Framework | |||
1840 | case FireAndForgetMethod.SmartThreadPool: | 1840 | case FireAndForgetMethod.SmartThreadPool: |
1841 | if (m_ThreadPool == null) | 1841 | if (m_ThreadPool == null) |
1842 | InitThreadPool(15); | 1842 | InitThreadPool(15); |
1843 | m_ThreadPool.QueueWorkItem(SmartThreadPoolCallback, new object[] { realCallback, obj }); | 1843 | m_ThreadPool.QueueWorkItem((cb, o) => cb(o), realCallback, obj); |
1844 | break; | 1844 | break; |
1845 | case FireAndForgetMethod.Thread: | 1845 | case FireAndForgetMethod.Thread: |
1846 | Thread thread = new Thread(delegate(object o) { realCallback(o); }); | 1846 | Thread thread = new Thread(delegate(object o) { realCallback(o); }); |
@@ -1910,15 +1910,15 @@ namespace OpenSim.Framework | |||
1910 | return sb.ToString(); | 1910 | return sb.ToString(); |
1911 | } | 1911 | } |
1912 | 1912 | ||
1913 | private static object SmartThreadPoolCallback(object o) | 1913 | // private static object SmartThreadPoolCallback(object o) |
1914 | { | 1914 | // { |
1915 | object[] array = (object[])o; | 1915 | // object[] array = (object[])o; |
1916 | WaitCallback callback = (WaitCallback)array[0]; | 1916 | // WaitCallback callback = (WaitCallback)array[0]; |
1917 | object obj = array[1]; | 1917 | // object obj = array[1]; |
1918 | 1918 | // | |
1919 | callback(obj); | 1919 | // callback(obj); |
1920 | return null; | 1920 | // return null; |
1921 | } | 1921 | // } |
1922 | 1922 | ||
1923 | #endregion FireAndForget Threading Pattern | 1923 | #endregion FireAndForget Threading Pattern |
1924 | 1924 | ||
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index 35ae44c..b9a217b 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -51,7 +51,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
51 | public interface IScriptWorkItem | 51 | public interface IScriptWorkItem |
52 | { | 52 | { |
53 | bool Cancel(); | 53 | bool Cancel(); |
54 | void Abort(); | 54 | bool Abort(); |
55 | 55 | ||
56 | /// <summary> | 56 | /// <summary> |
57 | /// Wait for the work item to complete. | 57 | /// Wait for the work item to complete. |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 1e6db43..f9d3afc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -564,9 +564,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
564 | 564 | ||
565 | public bool Stop(int timeout) | 565 | public bool Stop(int timeout) |
566 | { | 566 | { |
567 | // m_log.DebugFormat( | 567 | if (DebugLevel >= 1) |
568 | // "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}", | 568 | m_log.DebugFormat( |
569 | // ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks); | 569 | "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}", |
570 | ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks); | ||
570 | 571 | ||
571 | IScriptWorkItem workItem; | 572 | IScriptWorkItem workItem; |
572 | 573 | ||
@@ -627,6 +628,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
627 | } | 628 | } |
628 | } | 629 | } |
629 | 630 | ||
631 | Console.WriteLine("Here9"); | ||
632 | |||
630 | lock (EventQueue) | 633 | lock (EventQueue) |
631 | { | 634 | { |
632 | workItem = m_CurrentWorkItem; | 635 | workItem = m_CurrentWorkItem; |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 0d9babb..5804aa8 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -483,7 +483,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
483 | /// <param name="instance"></param> | 483 | /// <param name="instance"></param> |
484 | /// <param name="keySelector">Basis on which to sort output. Can be null if no sort needs to take place</param> | 484 | /// <param name="keySelector">Basis on which to sort output. Can be null if no sort needs to take place</param> |
485 | private void HandleScriptsAction<TKey>( | 485 | private void HandleScriptsAction<TKey>( |
486 | string[] cmdparams, Action<IScriptInstance> action, Func<IScriptInstance, TKey> keySelector) | 486 | string[] cmdparams, Action<IScriptInstance> action, System.Func<IScriptInstance, TKey> keySelector) |
487 | { | 487 | { |
488 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) | 488 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) |
489 | return; | 489 | return; |
@@ -1517,7 +1517,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1517 | startInfo.MaxWorkerThreads = maxThreads; | 1517 | startInfo.MaxWorkerThreads = maxThreads; |
1518 | startInfo.MinWorkerThreads = minThreads; | 1518 | startInfo.MinWorkerThreads = minThreads; |
1519 | startInfo.ThreadPriority = threadPriority;; | 1519 | startInfo.ThreadPriority = threadPriority;; |
1520 | startInfo.StackSize = stackSize; | 1520 | startInfo.MaxStackSize = stackSize; |
1521 | startInfo.StartSuspended = true; | 1521 | startInfo.StartSuspended = true; |
1522 | 1522 | ||
1523 | m_ThreadPool = new SmartThreadPool(startInfo); | 1523 | m_ThreadPool = new SmartThreadPool(startInfo); |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs index 8dd7677..9d9dee1 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs | |||
@@ -52,16 +52,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
52 | return wr.Cancel(); | 52 | return wr.Cancel(); |
53 | } | 53 | } |
54 | 54 | ||
55 | public void Abort() | 55 | public bool Abort() |
56 | { | 56 | { |
57 | wr.Abort(); | 57 | return wr.Cancel(true); |
58 | } | 58 | } |
59 | 59 | ||
60 | public bool Wait(int 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 | 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 | 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 | 64 | // int (32-bit) we can end up with bad values. This occurs on Windows though curiously not on Mono 2.10.8 |
65 | // (or very likely other versions of Mono at least up until 3.0.3). | 65 | // (or very likely other versions of Mono at least up until 3.0.3). |
66 | return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); | 66 | return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); |
67 | } | 67 | } |