aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorMelanie2009-10-22 02:28:53 +0100
committerMelanie2009-10-22 02:28:53 +0100
commit8a336c6860d66b9fbba6922c32e7a57fd355c57e (patch)
treeb519399cadf118bdb5a48fce9597e65d79667a0e /OpenSim
parentMark new version (diff)
downloadopensim-SC-8a336c6860d66b9fbba6922c32e7a57fd355c57e.zip
opensim-SC-8a336c6860d66b9fbba6922c32e7a57fd355c57e.tar.gz
opensim-SC-8a336c6860d66b9fbba6922c32e7a57fd355c57e.tar.bz2
opensim-SC-8a336c6860d66b9fbba6922c32e7a57fd355c57e.tar.xz
Add MaxPoolThreads in startup to limit the size of the thread pool used
for FireAndForget. This lets us limit concurrency to make OpenSim play nice
Diffstat (limited to '')
-rw-r--r--OpenSim/Framework/Util.cs34
-rw-r--r--OpenSim/Region/Application/OpenSim.cs2
2 files changed, 24 insertions, 12 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index d5ae3b7..9dfb75e 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -41,12 +41,14 @@ using System.Security.Cryptography;
41using System.Text; 41using System.Text;
42using System.Text.RegularExpressions; 42using System.Text.RegularExpressions;
43using System.Xml; 43using System.Xml;
44using System.Threading;
44using log4net; 45using log4net;
45using Nini.Config; 46using Nini.Config;
46using Nwc.XmlRpc; 47using Nwc.XmlRpc;
47using BclExtras; 48using BclExtras;
48using OpenMetaverse; 49using OpenMetaverse;
49using OpenMetaverse.StructuredData; 50using OpenMetaverse.StructuredData;
51using Amib.Threading;
50 52
51namespace OpenSim.Framework 53namespace OpenSim.Framework
52{ 54{
@@ -55,6 +57,8 @@ namespace OpenSim.Framework
55 /// </summary> 57 /// </summary>
56 public class Util 58 public class Util
57 { 59 {
60 private static SmartThreadPool m_ThreadPool = null;
61
58 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 62 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
59 63
60 private static uint nextXferID = 5000; 64 private static uint nextXferID = 5000;
@@ -1293,22 +1297,28 @@ namespace OpenSim.Framework
1293 System.Threading.ThreadPool.UnsafeQueueUserWorkItem(callback, null); 1297 System.Threading.ThreadPool.UnsafeQueueUserWorkItem(callback, null);
1294 } 1298 }
1295 1299
1296 public static void FireAndForget(System.Threading.WaitCallback callback, object obj) 1300 public static void SetMaxThreads(int maxThreads)
1297 { 1301 {
1298 //FireAndForgetWrapper wrapper = Singleton.GetInstance<FireAndForgetWrapper>(); 1302 STPStartInfo startInfo = new STPStartInfo();
1299 //wrapper.FireAndForget(callback, obj); 1303 startInfo.IdleTimeout = 2000; // 2 seconds
1300 System.Threading.ThreadPool.UnsafeQueueUserWorkItem(callback, obj); 1304 startInfo.MaxWorkerThreads = maxThreads;
1301 } 1305 startInfo.MinWorkerThreads = 5;
1306 startInfo.StackSize = 524288;
1307 startInfo.ThreadPriority = ThreadPriority.Normal;
1302 1308
1303 /*private static void EndFireAndForget(IAsyncResult ar) 1309 startInfo.StartSuspended = false;
1304 {
1305 System.Threading.WaitCallback callback = (System.Threading.WaitCallback)ar.AsyncState;
1306 1310
1307 try { callback.EndInvoke(ar); } 1311 m_ThreadPool = new SmartThreadPool(startInfo);
1308 catch (Exception ex) { m_log.Error("[UTIL]: Asynchronous method threw an exception: " + ex.Message, ex); } 1312 }
1309 1313
1310 ar.AsyncWaitHandle.Close(); 1314 public static void FireAndForget(System.Threading.WaitCallback callback, object obj)
1311 }*/ 1315 {
1316 m_ThreadPool.QueueWorkItem(new WorkItemCallback(delegate(object o)
1317 {
1318 callback(o);
1319 return null;
1320 }), obj);
1321 }
1312 1322
1313 #endregion FireAndForget Threading Pattern 1323 #endregion FireAndForget Threading Pattern
1314 } 1324 }
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index 143dd2a..42e2a1e 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -67,6 +67,8 @@ 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", 30));
71
70 if (startupConfig != null) 72 if (startupConfig != null)
71 { 73 {
72 m_startupCommandsFile = startupConfig.GetString("startup_console_commands_file", "startup_commands.txt"); 74 m_startupCommandsFile = startupConfig.GetString("startup_console_commands_file", "startup_commands.txt");