aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorTedd Hansen2008-02-01 20:12:25 +0000
committerTedd Hansen2008-02-01 20:12:25 +0000
commita9c1f3fdb4f7c7de0fe5e61ed0ecad7318137973 (patch)
treeb4f7d09923248de11a88b7faf1f40521e9f1efc6
parentHighly experimental (diff)
downloadopensim-SC_OLD-a9c1f3fdb4f7c7de0fe5e61ed0ecad7318137973.zip
opensim-SC_OLD-a9c1f3fdb4f7c7de0fe5e61ed0ecad7318137973.tar.gz
opensim-SC_OLD-a9c1f3fdb4f7c7de0fe5e61ed0ecad7318137973.tar.bz2
opensim-SC_OLD-a9c1f3fdb4f7c7de0fe5e61ed0ecad7318137973.tar.xz
Experimental
Moved DotNetScriptEngine configuration to config file. Added option to share script execution threads between regions.
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs52
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/LSOEngine/ScriptEngine.cs6
-rw-r--r--bin/OpenSim.ini.example32
6 files changed, 99 insertions, 9 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs
index 70db724..730b63e 100644
--- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs
+++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs
@@ -69,21 +69,25 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
69 /// <summary> 69 /// <summary>
70 /// List of threads processing event queue 70 /// List of threads processing event queue
71 /// </summary> 71 /// </summary>
72 private List<EventQueueThreadClass> eventQueueThreads = new List<EventQueueThreadClass>(); 72 private List<EventQueueThreadClass> eventQueueThreads;// = new List<EventQueueThreadClass>();
73 private object eventQueueThreadsLock = new object(); 73 private object eventQueueThreadsLock;// = new object();
74
75 private static List<EventQueueThreadClass> staticEventQueueThreads;// = new List<EventQueueThreadClass>();
76 private static object staticEventQueueThreadsLock;// = new object();
74 77
75 public object queueLock = new object(); // Mutex lock object 78 public object queueLock = new object(); // Mutex lock object
76 79
77 /// <summary> 80 /// <summary>
78 /// How many threads to process queue with 81 /// How many threads to process queue with
79 /// </summary> 82 /// </summary>
80 private int numberOfThreads = 2; 83 private int numberOfThreads;
81 84
82 /// <summary> 85 /// <summary>
83 /// Maximum time one function can use for execution before we perform a thread kill 86 /// Maximum time one function can use for execution before we perform a thread kill
84 /// </summary> 87 /// </summary>
85 private int maxFunctionExecutionTimems = 50; 88 private int maxFunctionExecutionTimems;
86 private bool EnforceMaxExecutionTime = true; 89 private bool EnforceMaxExecutionTime;
90
87 91
88 /// <summary> 92 /// <summary>
89 /// Queue containing events waiting to be executed 93 /// Queue containing events waiting to be executed
@@ -138,6 +142,36 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
138 { 142 {
139 m_ScriptEngine = _ScriptEngine; 143 m_ScriptEngine = _ScriptEngine;
140 144
145
146 // Create thread pool list and lock object
147 // Determine from config if threads should be dedicated to regions or shared
148 if (m_ScriptEngine.ScriptConfigSource.GetBoolean("PrivateRegionThreads", false))
149 {
150 // PRIVATE THREAD POOL PER REGION
151 eventQueueThreads = new List<EventQueueThreadClass>();
152 eventQueueThreadsLock = new object();
153 }
154 else
155 {
156 // SHARED THREAD POOL
157 // Crate the objects in statics
158 if (staticEventQueueThreads == null)
159 staticEventQueueThreads = new List<EventQueueThreadClass>();
160 if (staticEventQueueThreadsLock == null)
161 staticEventQueueThreadsLock = new object();
162
163 // Create local reference to them
164 eventQueueThreads = staticEventQueueThreads;
165 eventQueueThreadsLock = staticEventQueueThreadsLock;
166 }
167
168 numberOfThreads = m_ScriptEngine.ScriptConfigSource.GetInt("NumberOfScriptThreads", 2);
169
170 maxFunctionExecutionTimems = m_ScriptEngine.ScriptConfigSource.GetInt("MaxEventExecutionTimeMs", 5000);
171 EnforceMaxExecutionTime = m_ScriptEngine.ScriptConfigSource.GetBoolean("EnforceMaxEventExecutionTime", false);
172
173
174
141 // Start function max exec time enforcement thread 175 // Start function max exec time enforcement thread
142 if (EnforceMaxExecutionTime) 176 if (EnforceMaxExecutionTime)
143 { 177 {
@@ -150,9 +184,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
150 // 184 //
151 // Start event queue processing threads (worker threads) 185 // Start event queue processing threads (worker threads)
152 // 186 //
187
153 lock (eventQueueThreadsLock) 188 lock (eventQueueThreadsLock)
154 { 189 {
155 for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++) 190 for (int ThreadCount = eventQueueThreads.Count; ThreadCount <= numberOfThreads; ThreadCount++)
156 { 191 {
157 StartNewThreadClass(); 192 StartNewThreadClass();
158 } 193 }
@@ -315,7 +350,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
315 } 350 }
316 } 351 }
317 352
318 private static void AbortThreadClass(EventQueueThreadClass threadClass) 353 private void AbortThreadClass(EventQueueThreadClass threadClass)
319 { 354 {
320 try 355 try
321 { 356 {
@@ -326,12 +361,15 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
326 Console.WriteLine("Could you please report this to Tedd:"); 361 Console.WriteLine("Could you please report this to Tedd:");
327 Console.WriteLine("Script thread execution timeout kill ended in exception: " + ex.ToString()); 362 Console.WriteLine("Script thread execution timeout kill ended in exception: " + ex.ToString());
328 } 363 }
364 m_ScriptEngine.Log.Debug("DotNetEngine", "Killed script execution thread, count: " + eventQueueThreads.Count);
329 } 365 }
330 366
331 private void StartNewThreadClass() 367 private void StartNewThreadClass()
332 { 368 {
333 EventQueueThreadClass eqtc = new EventQueueThreadClass(this); 369 EventQueueThreadClass eqtc = new EventQueueThreadClass(this);
334 eventQueueThreads.Add(eqtc); 370 eventQueueThreads.Add(eqtc);
371 m_ScriptEngine.Log.Debug("DotNetEngine", "Started new script execution thread, count: " + eventQueueThreads.Count);
372
335 } 373 }
336 } 374 }
337} \ No newline at end of file 375} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs
index ad79fbc..67cf0e2 100644
--- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs
+++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
3using System.Text; 3using System.Text;
4using System.Threading; 4using System.Threading;
5using libsecondlife; 5using libsecondlife;
6using Nini.Config;
6using OpenSim.Framework; 7using OpenSim.Framework;
7using OpenSim.Region.Environment.Scenes.Scripting; 8using OpenSim.Region.Environment.Scenes.Scripting;
8 9
@@ -16,7 +17,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
16 /// <summary> 17 /// <summary>
17 /// How many ms to sleep if queue is empty 18 /// How many ms to sleep if queue is empty
18 /// </summary> 19 /// </summary>
19 private int nothingToDoSleepms = 50; 20 private int nothingToDoSleepms;// = 50;
20 21
21 public DateTime LastExecutionStarted; 22 public DateTime LastExecutionStarted;
22 public bool InExecution = false; 23 public bool InExecution = false;
@@ -28,6 +29,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
28 public EventQueueThreadClass(EventQueueManager eqm) 29 public EventQueueThreadClass(EventQueueManager eqm)
29 { 30 {
30 eventQueueManager = eqm; 31 eventQueueManager = eqm;
32 nothingToDoSleepms = eqm.m_ScriptEngine.ScriptConfigSource.GetInt("SleepTimeIfNoScriptExecutionMs", 50);
31 Start(); 33 Start();
32 } 34 }
33 35
@@ -183,7 +185,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
183 } 185 }
184 catch (ThreadAbortException tae) 186 catch (ThreadAbortException tae)
185 { 187 {
186 throw tae; 188 eventQueueManager.m_ScriptEngine.Log.Notice("ScriptEngine", "ThreadAbortException while executing function.");
187 } 189 }
188 catch (Exception e) 190 catch (Exception e)
189 { 191 {
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs
index da0baba..8b64d3d 100644
--- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs
+++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs
@@ -51,10 +51,15 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
51 public AppDomainManager m_AppDomainManager; 51 public AppDomainManager m_AppDomainManager;
52 public LSLLongCmdHandler m_LSLLongCmdHandler; 52 public LSLLongCmdHandler m_LSLLongCmdHandler;
53 53
54 public IConfigSource ConfigSource;
55 public IConfig ScriptConfigSource;
56 public abstract string ScriptConfigSourceName { get; }
57
54 public ScriptManager GetScriptManager() 58 public ScriptManager GetScriptManager()
55 { 59 {
56 return _GetScriptManager(); 60 return _GetScriptManager();
57 } 61 }
62
58 public abstract ScriptManager _GetScriptManager(); 63 public abstract ScriptManager _GetScriptManager();
59 64
60 private LogBase m_log; 65 private LogBase m_log;
@@ -74,6 +79,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
74 { 79 {
75 World = Sceneworld; 80 World = Sceneworld;
76 m_log = logger; 81 m_log = logger;
82 ScriptConfigSource = ConfigSource.Configs[ScriptConfigSourceName];
77 83
78 Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing"); 84 Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing");
79 85
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs
index 48ac3bb..de168b7 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs
@@ -39,6 +39,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
39 // We need to override a few things for our DotNetEngine 39 // We need to override a few things for our DotNetEngine
40 public override void Initialise(Scene scene, IConfigSource config) 40 public override void Initialise(Scene scene, IConfigSource config)
41 { 41 {
42 ConfigSource = config;
42 InitializeEngine(scene, MainLog.Instance, true, GetScriptManager()); 43 InitializeEngine(scene, MainLog.Instance, true, GetScriptManager());
43 } 44 }
44 45
@@ -46,5 +47,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
46 { 47 {
47 return new ScriptManager(this); 48 return new ScriptManager(this);
48 } 49 }
50
51 public override string ScriptConfigSourceName
52 {
53 get { return "ScriptEngine.DotNetEngine"; }
54 }
49 } 55 }
50} \ No newline at end of file 56} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/LSOEngine/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/LSOEngine/ScriptEngine.cs
index 342a8ca..aac210b 100644
--- a/OpenSim/Region/ScriptEngine/LSOEngine/ScriptEngine.cs
+++ b/OpenSim/Region/ScriptEngine/LSOEngine/ScriptEngine.cs
@@ -51,5 +51,11 @@ namespace OpenSim.Region.ScriptEngine.LSOEngine
51 { 51 {
52 return new ScriptManager(this); 52 return new ScriptManager(this);
53 } 53 }
54
55 public override string ScriptConfigSourceName
56 {
57 get { return "ScriptEngine.LSOEngine"; }
58 }
59
54 } 60 }
55} \ No newline at end of file 61} \ No newline at end of file
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 784083d..a0ada5c 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -114,3 +114,35 @@ shout_distance = 100
114; send a Sun update ever frame_rate # of frames. A lower number will 114; send a Sun update ever frame_rate # of frames. A lower number will
115; make for smoother sun transition at the cost of network 115; make for smoother sun transition at the cost of network
116;frame_rate = 100 116;frame_rate = 100
117
118[ScriptEngine.DotNetEngine]
119
120; When a script receives an event the event is queued.
121; Any free thread will start executing this event. One script can only have one event executed simultaneously.
122; If you have only one thread, and one script has a loop or does a lot of work, then no other scripts can run at the same time.
123; Same if you have 10 threads, then only 10 scripts can be run simultaneously.
124; But because most scripts exit after their task, the threads are free to go on to the next script.
125
126; Number of threads to use for script event execution
127; Threads are shared across all regions
128NumberOfScriptThreads=2
129
130; Should the script threads be private for each region?
131; true: Each region will get <NumberOfScriptThreads> dedicated to scripts within that region
132; Number of threads will be <NumberOfScriptThreads>*<NumberOfRegions>
133; false: All regions share <NumberOfScriptThreads> for all their scripts
134PrivateRegionThreads=false
135
136; How long MAX should a script be allowed to run?
137; Do not set this too low (like 50ms) as there are some time wasted in simply executing a function
138; There is also a small speed penalty for every kill that is made
139MaxEventExecutionTimeMs=5000
140
141; Should we enable the max script event execution thread to look for scripts that exceed their timeslice?
142EnforceMaxEventExecutionTime=true
143
144; If no scripts have executed in this pass how long should we sleep before checking again
145; Impact:
146; Too low and you will waste lots of CPU
147; Too high and people touching object or similar will have to wait up to this amount of time before script responding
148SleepTimeIfNoScriptExecutionMs=50