aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorMelanie2009-10-22 02:28:53 +0100
committerMelanie2009-10-22 02:28:53 +0100
commit8a336c6860d66b9fbba6922c32e7a57fd355c57e (patch)
treeb519399cadf118bdb5a48fce9597e65d79667a0e
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
-rw-r--r--bin/OpenSim.ini.example3
-rw-r--r--prebuild.xml45
4 files changed, 50 insertions, 34 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");
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 2d56f4e..92e6d91 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -42,6 +42,9 @@
42 ; Set this to the DLL containing the client stack to use. 42 ; Set this to the DLL containing the client stack to use.
43 clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll" 43 clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll"
44 44
45 ; Max threads to allocate on the FireAndForget pool
46 MaxPoolThreads = 30
47
45 ; ## 48 ; ##
46 ; ## REGIONS 49 ; ## REGIONS
47 ; ## 50 ; ##
diff --git a/prebuild.xml b/prebuild.xml
index e17da9a..81f907d 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -117,6 +117,28 @@
117 </Files> 117 </Files>
118 </Project> 118 </Project>
119 119
120 <Project frameworkVersion="v3_5" name="SmartThreadPool" path="ThirdParty/SmartThreadPool" type="Library">
121 <Configuration name="Debug">
122 <Options>
123 <OutputPath>../../bin/</OutputPath>
124 </Options>
125 </Configuration>
126 <Configuration name="Release">
127 <Options>
128 <OutputPath>../../bin/</OutputPath>
129 </Options>
130 </Configuration>
131
132 <ReferencePath>../../bin/</ReferencePath>
133 <Reference name="System"/>
134 <Reference name="System.Xml"/>
135 <Reference name="System.Data"/>
136 <Reference name="System.Web"/>
137 <Files>
138 <Match pattern="*.cs" recurse="false"/>
139 </Files>
140 </Project>
141
120 <Project frameworkVersion="v3_5" name="OpenSim.Framework" path="OpenSim/Framework" type="Library"> 142 <Project frameworkVersion="v3_5" name="OpenSim.Framework" path="OpenSim/Framework" type="Library">
121 <Configuration name="Debug"> 143 <Configuration name="Debug">
122 <Options> 144 <Options>
@@ -145,6 +167,7 @@
145 <Reference name="Nini.dll" /> 167 <Reference name="Nini.dll" />
146 <Reference name="log4net.dll"/> 168 <Reference name="log4net.dll"/>
147 <Reference name="Mono.Addins.dll" /> 169 <Reference name="Mono.Addins.dll" />
170 <Reference name="SmartThreadPool" />
148 <Files> 171 <Files>
149 <Match pattern="*.cs" recurse="false"/> 172 <Match pattern="*.cs" recurse="false"/>
150 <Match path="Client" pattern="*.cs" recurse="true"/> 173 <Match path="Client" pattern="*.cs" recurse="true"/>
@@ -2387,28 +2410,6 @@
2387 </Files> 2410 </Files>
2388 </Project> 2411 </Project>
2389 2412
2390 <Project frameworkVersion="v3_5" name="SmartThreadPool" path="ThirdParty/SmartThreadPool" type="Library">
2391 <Configuration name="Debug">
2392 <Options>
2393 <OutputPath>../../bin/</OutputPath>
2394 </Options>
2395 </Configuration>
2396 <Configuration name="Release">
2397 <Options>
2398 <OutputPath>../../bin/</OutputPath>
2399 </Options>
2400 </Configuration>
2401
2402 <ReferencePath>../../bin/</ReferencePath>
2403 <Reference name="System"/>
2404 <Reference name="System.Xml"/>
2405 <Reference name="System.Data"/>
2406 <Reference name="System.Web"/>
2407 <Files>
2408 <Match pattern="*.cs" recurse="false"/>
2409 </Files>
2410 </Project>
2411
2412 <Project frameworkVersion="v3_5" name="OpenSim.Region.ScriptEngine.Shared" path="OpenSim/Region/ScriptEngine/Shared" type="Library"> 2413 <Project frameworkVersion="v3_5" name="OpenSim.Region.ScriptEngine.Shared" path="OpenSim/Region/ScriptEngine/Shared" type="Library">
2413 <Configuration name="Debug"> 2414 <Configuration name="Debug">
2414 <Options> 2415 <Options>