aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorSean Dague2008-05-07 18:10:18 +0000
committerSean Dague2008-05-07 18:10:18 +0000
commitedd6577f84cb4714c8d1c0b156ffbddfe3b1f87e (patch)
treef60c038e6df6b67e38e73dbacff2090286446e40
parent*Fixed Missing SceneExternalChecks.cs (diff)
downloadopensim-SC_OLD-edd6577f84cb4714c8d1c0b156ffbddfe3b1f87e.zip
opensim-SC_OLD-edd6577f84cb4714c8d1c0b156ffbddfe3b1f87e.tar.gz
opensim-SC_OLD-edd6577f84cb4714c8d1c0b156ffbddfe3b1f87e.tar.bz2
opensim-SC_OLD-edd6577f84cb4714c8d1c0b156ffbddfe3b1f87e.tar.xz
while I'm not convinced this is causing my current run away
loop, this queue manipulation is dead wrong as Queue is not a synchronized data structure. Hopefully this helps.
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs39
1 files changed, 21 insertions, 18 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs
index 7812c8c..f5de967 100644
--- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs
+++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs
@@ -207,11 +207,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
207 207
208 public void DoScriptLoadUnload() 208 public void DoScriptLoadUnload()
209 { 209 {
210 if (LUQueue.Count > 0) 210 lock (LUQueue) {
211 { 211 if (LUQueue.Count > 0)
212 LUStruct item = LUQueue.Dequeue();
213 lock (startStopLock) // Lock so we have only 1 thread working on loading/unloading of scripts
214 { 212 {
213 LUStruct item = LUQueue.Dequeue();
214
215 if (item.Action == LUType.Unload) 215 if (item.Action == LUType.Unload)
216 { 216 {
217 _StopScript(item.localID, item.itemID); 217 _StopScript(item.localID, item.itemID);
@@ -222,9 +222,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
222 } 222 }
223 } 223 }
224 } 224 }
225
226 } 225 }
227 226
228 #endregion 227 #endregion
229 228
230 #region Helper functions 229 #region Helper functions
@@ -250,18 +249,20 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
250 /// <param name="localID"></param> 249 /// <param name="localID"></param>
251 public void StartScript(uint localID, LLUUID itemID, string Script) 250 public void StartScript(uint localID, LLUUID itemID, string Script)
252 { 251 {
253 if (LUQueue.Count >= LoadUnloadMaxQueueSize) 252 lock(LUQueue) {
254 { 253 if (LUQueue.Count >= LoadUnloadMaxQueueSize)
255 m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: ERROR: Load/unload queue item count is at " + LUQueue.Count + ". Config variable \"LoadUnloadMaxQueueSize\" is set to " + LoadUnloadMaxQueueSize + ", so ignoring new script."); 254 {
256 return; 255 m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: ERROR: Load/unload queue item count is at " + LUQueue.Count + ". Config variable \"LoadUnloadMaxQueueSize\" is set to " + LoadUnloadMaxQueueSize + ", so ignoring new script.");
257 } 256 return;
257 }
258 258
259 LUStruct ls = new LUStruct(); 259 LUStruct ls = new LUStruct();
260 ls.localID = localID; 260 ls.localID = localID;
261 ls.itemID = itemID; 261 ls.itemID = itemID;
262 ls.script = Script; 262 ls.script = Script;
263 ls.Action = LUType.Load; 263 ls.Action = LUType.Load;
264 LUQueue.Enqueue(ls); 264 LUQueue.Enqueue(ls);
265 }
265 } 266 }
266 267
267 /// <summary> 268 /// <summary>
@@ -275,7 +276,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
275 ls.localID = localID; 276 ls.localID = localID;
276 ls.itemID = itemID; 277 ls.itemID = itemID;
277 ls.Action = LUType.Unload; 278 ls.Action = LUType.Unload;
278 LUQueue.Enqueue(ls); 279 lock (LUQueue) {
280 LUQueue.Enqueue(ls);
281 }
279 } 282 }
280 283
281 // Create a new instance of the compiler (reuse) 284 // Create a new instance of the compiler (reuse)