diff options
author | John Hurliman | 2009-10-22 01:30:12 -0700 |
---|---|---|
committer | John Hurliman | 2009-10-22 01:30:12 -0700 |
commit | 2f394b7e7ebf991c7a70f93bf251d26d8043aaa2 (patch) | |
tree | 28e1635d47af4cfe4337d1d68f30090860ca01ca | |
parent | Remove the "mel_t" from version string (diff) | |
download | opensim-SC-2f394b7e7ebf991c7a70f93bf251d26d8043aaa2.zip opensim-SC-2f394b7e7ebf991c7a70f93bf251d26d8043aaa2.tar.gz opensim-SC-2f394b7e7ebf991c7a70f93bf251d26d8043aaa2.tar.bz2 opensim-SC-2f394b7e7ebf991c7a70f93bf251d26d8043aaa2.tar.xz |
* Allow SmartThreadPool to be initialized without setting max stack size (like the original implementation)
* Only initialize Util's SmartThreadPool if it is actually being used
* No longer initializing Util's SmartThreadPool with a custom max stack size. From MSDN: "Avoid using this constructor overload. The default stack size used by the Thread(ThreadStart) constructor overload is the recommended stack size for threads."
-rw-r--r-- | OpenSim/Framework/Util.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Application/OpenSim.cs | 7 | ||||
-rw-r--r-- | ThirdParty/SmartThreadPool/SmartThreadPool.cs | 6 | ||||
-rw-r--r-- | bin/OpenSim.ini.example | 14 |
4 files changed, 27 insertions, 12 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index d09bd6d..167e34d 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -69,8 +69,6 @@ namespace OpenSim.Framework | |||
69 | /// </summary> | 69 | /// </summary> |
70 | public class Util | 70 | public class Util |
71 | { | 71 | { |
72 | private static SmartThreadPool m_ThreadPool = null; | ||
73 | |||
74 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 72 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
75 | 73 | ||
76 | private static uint nextXferID = 5000; | 74 | private static uint nextXferID = 5000; |
@@ -79,6 +77,9 @@ namespace OpenSim.Framework | |||
79 | private static string regexInvalidFileChars = "[" + new String(Path.GetInvalidFileNameChars()) + "]"; | 77 | private static string regexInvalidFileChars = "[" + new String(Path.GetInvalidFileNameChars()) + "]"; |
80 | private static string regexInvalidPathChars = "[" + new String(Path.GetInvalidPathChars()) + "]"; | 78 | private static string regexInvalidPathChars = "[" + new String(Path.GetInvalidPathChars()) + "]"; |
81 | private static object XferLock = new object(); | 79 | private static object XferLock = new object(); |
80 | /// <summary>Thread pool used for Util.FireAndForget if | ||
81 | /// FireAndForgetMethod.SmartThreadPool is used</summary> | ||
82 | private static SmartThreadPool m_ThreadPool; | ||
82 | 83 | ||
83 | // Unix-epoch starts at January 1st 1970, 00:00:00 UTC. And all our times in the server are (or at least should be) in UTC. | 84 | // Unix-epoch starts at January 1st 1970, 00:00:00 UTC. And all our times in the server are (or at least should be) in UTC. |
84 | private static readonly DateTime unixEpoch = | 85 | private static readonly DateTime unixEpoch = |
@@ -1319,8 +1320,11 @@ namespace OpenSim.Framework | |||
1319 | FireAndForget(callback, null); | 1320 | FireAndForget(callback, null); |
1320 | } | 1321 | } |
1321 | 1322 | ||
1322 | public static void SetMaxThreads(int maxThreads) | 1323 | public static void InitThreadPool(int maxThreads) |
1323 | { | 1324 | { |
1325 | if (maxThreads < 2) | ||
1326 | throw new ArgumentOutOfRangeException("maxThreads", "maxThreads must be greater than 2"); | ||
1327 | |||
1324 | if (m_ThreadPool != null) | 1328 | if (m_ThreadPool != null) |
1325 | return; | 1329 | return; |
1326 | 1330 | ||
@@ -1328,9 +1332,7 @@ namespace OpenSim.Framework | |||
1328 | startInfo.IdleTimeout = 2000; // 2 seconds | 1332 | startInfo.IdleTimeout = 2000; // 2 seconds |
1329 | startInfo.MaxWorkerThreads = maxThreads; | 1333 | startInfo.MaxWorkerThreads = maxThreads; |
1330 | startInfo.MinWorkerThreads = 2; | 1334 | startInfo.MinWorkerThreads = 2; |
1331 | startInfo.StackSize = 524288; | ||
1332 | startInfo.ThreadPriority = ThreadPriority.Normal; | 1335 | startInfo.ThreadPriority = ThreadPriority.Normal; |
1333 | |||
1334 | startInfo.StartSuspended = false; | 1336 | startInfo.StartSuspended = false; |
1335 | 1337 | ||
1336 | m_ThreadPool = new SmartThreadPool(startInfo); | 1338 | m_ThreadPool = new SmartThreadPool(startInfo); |
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index c04b8c2..26298e7 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs | |||
@@ -67,7 +67,7 @@ namespace OpenSim | |||
67 | 67 | ||
68 | IConfig startupConfig = m_config.Source.Configs["Startup"]; | 68 | IConfig startupConfig = m_config.Source.Configs["Startup"]; |
69 | 69 | ||
70 | Util.SetMaxThreads(startupConfig.GetInt("MaxPoolThreads", 15)); | 70 | int stpMaxThreads = 15; |
71 | 71 | ||
72 | if (startupConfig != null) | 72 | if (startupConfig != null) |
73 | { | 73 | { |
@@ -100,8 +100,13 @@ namespace OpenSim | |||
100 | FireAndForgetMethod asyncCallMethod; | 100 | FireAndForgetMethod asyncCallMethod; |
101 | if (!String.IsNullOrEmpty(asyncCallMethodStr) && Utils.EnumTryParse<FireAndForgetMethod>(asyncCallMethodStr, out asyncCallMethod)) | 101 | if (!String.IsNullOrEmpty(asyncCallMethodStr) && Utils.EnumTryParse<FireAndForgetMethod>(asyncCallMethodStr, out asyncCallMethod)) |
102 | Util.FireAndForgetMethod = asyncCallMethod; | 102 | Util.FireAndForgetMethod = asyncCallMethod; |
103 | |||
104 | stpMaxThreads = startupConfig.GetInt("MaxPoolThreads", 15); | ||
103 | } | 105 | } |
104 | 106 | ||
107 | if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool) | ||
108 | Util.InitThreadPool(stpMaxThreads); | ||
109 | |||
105 | m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); | 110 | m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); |
106 | } | 111 | } |
107 | 112 | ||
diff --git a/ThirdParty/SmartThreadPool/SmartThreadPool.cs b/ThirdParty/SmartThreadPool/SmartThreadPool.cs index c21984e..bd52f62 100644 --- a/ThirdParty/SmartThreadPool/SmartThreadPool.cs +++ b/ThirdParty/SmartThreadPool/SmartThreadPool.cs | |||
@@ -499,7 +499,11 @@ namespace Amib.Threading | |||
499 | } | 499 | } |
500 | 500 | ||
501 | // Create a new thread | 501 | // Create a new thread |
502 | Thread workerThread = new Thread(new ThreadStart(ProcessQueuedItems), _stpStartInfo.StackSize); | 502 | Thread workerThread; |
503 | if (_stpStartInfo.StackSize > 0) | ||
504 | workerThread = new Thread(ProcessQueuedItems, _stpStartInfo.StackSize); | ||
505 | else | ||
506 | workerThread = new Thread(ProcessQueuedItems); | ||
503 | 507 | ||
504 | // Configure the new thread and start it | 508 | // Configure the new thread and start it |
505 | workerThread.Name = "STP " + Name + " Thread #" + _threadCounter; | 509 | workerThread.Name = "STP " + Name + " Thread #" + _threadCounter; |
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 79d57d2..08f87d6 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -38,8 +38,15 @@ | |||
38 | 38 | ||
39 | ; Sets the method that OpenSim will use to fire asynchronous | 39 | ; Sets the method that OpenSim will use to fire asynchronous |
40 | ; events. Valid values are UnsafeQueueUserWorkItem, | 40 | ; events. Valid values are UnsafeQueueUserWorkItem, |
41 | ; QueueUserWorkItem, BeginInvoke, SmartThreadPool, and Thread | 41 | ; QueueUserWorkItem, BeginInvoke, SmartThreadPool, and Thread. |
42 | ; async_call_method = SmartThreadPool | 42 | ; SmartThreadPool is reported to work well on Mono/Linux, but |
43 | ; UnsafeQueueUserWorkItem has been benchmarked with better | ||
44 | ; performance on .NET/Windows | ||
45 | ;async_call_method = SmartThreadPool | ||
46 | |||
47 | ; Max threads to allocate on the FireAndForget thread pool | ||
48 | ; when running with the SmartThreadPool option above | ||
49 | MaxPoolThreads = 15 | ||
43 | 50 | ||
44 | ; ## | 51 | ; ## |
45 | ; ## CLIENTS | 52 | ; ## CLIENTS |
@@ -51,9 +58,6 @@ | |||
51 | ; Set this to the DLL containing the client stack to use. | 58 | ; Set this to the DLL containing the client stack to use. |
52 | clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll" | 59 | clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll" |
53 | 60 | ||
54 | ; Max threads to allocate on the FireAndForget pool | ||
55 | MaxPoolThreads = 15 | ||
56 | |||
57 | ; ## | 61 | ; ## |
58 | ; ## REGIONS | 62 | ; ## REGIONS |
59 | ; ## | 63 | ; ## |