aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorunknown2009-10-23 03:52:49 -0700
committerMelanie2009-10-23 11:25:06 +0100
commit71c929137f48a0a7d97dbc866cbe2b12319aa40b (patch)
treed06fa40f9d203b9d1333412672cacd2f334a0a10
parentFix a glitch in a ROBUST message (diff)
downloadopensim-SC-71c929137f48a0a7d97dbc866cbe2b12319aa40b.zip
opensim-SC-71c929137f48a0a7d97dbc866cbe2b12319aa40b.tar.gz
opensim-SC-71c929137f48a0a7d97dbc866cbe2b12319aa40b.tar.bz2
opensim-SC-71c929137f48a0a7d97dbc866cbe2b12319aa40b.tar.xz
Inconsistent locking of SenseRepeaters in Script Engine.
When I attempt to 'save oar' on a region with thousands of scripts with timers, I get a NullReferenceException every time. The problem comes from inconsistent locking in SensorRepeat.cs of the SenseRepeaters List. It is iterated and modified in many places and these places are all wrapped in a lock except in the GetSerializationData(). This is the function throwing the exception because an item in the list becomes null during iteration. The attached patch locks SenseRepeatListLock in GetSerializationData()
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs19
1 files changed, 11 insertions, 8 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index ee01c3c..b75a2e4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -516,16 +516,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
516 { 516 {
517 List<Object> data = new List<Object>(); 517 List<Object> data = new List<Object>();
518 518
519 foreach (SenseRepeatClass ts in SenseRepeaters) 519 lock (SenseRepeatListLock)
520 { 520 {
521 if (ts.itemID == itemID) 521 foreach (SenseRepeatClass ts in SenseRepeaters)
522 { 522 {
523 data.Add(ts.interval); 523 if (ts.itemID == itemID)
524 data.Add(ts.name); 524 {
525 data.Add(ts.keyID); 525 data.Add(ts.interval);
526 data.Add(ts.type); 526 data.Add(ts.name);
527 data.Add(ts.range); 527 data.Add(ts.keyID);
528 data.Add(ts.arc); 528 data.Add(ts.type);
529 data.Add(ts.range);
530 data.Add(ts.arc);
531 }
529 } 532 }
530 } 533 }
531 return data.ToArray(); 534 return data.ToArray();