aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs78
1 files changed, 43 insertions, 35 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index f2c8b60..06495bb 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -51,8 +51,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
51 { 51 {
52 get 52 get
53 { 53 {
54 lock (SenseRepeatListLock) 54 return SenseRepeaters.Count;
55 return SenseRepeaters.Count;
56 } 55 }
57 } 56 }
58 57
@@ -116,6 +115,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
116 public double distance; 115 public double distance;
117 } 116 }
118 117
118 /// <summary>
119 /// Sensors to process.
120 /// </summary>
121 /// <remarks>
122 /// Do not add or remove sensors from this list directly. Instead, copy the list and substitute the updated
123 /// copy. This is to avoid locking the list for the duration of the sensor sweep, which increases the danger
124 /// of deadlocks with future code updates.
125 ///
126 /// Always lock SenseRepeatListLock when updating this list.
127 /// </remarks>
119 private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>(); 128 private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>();
120 private object SenseRepeatListLock = new object(); 129 private object SenseRepeatListLock = new object();
121 130
@@ -125,6 +134,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
125 { 134 {
126 // Always remove first, in case this is a re-set 135 // Always remove first, in case this is a re-set
127 UnSetSenseRepeaterEvents(m_localID, m_itemID); 136 UnSetSenseRepeaterEvents(m_localID, m_itemID);
137
128 if (sec == 0) // Disabling timer 138 if (sec == 0) // Disabling timer
129 return; 139 return;
130 140
@@ -144,9 +154,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
144 ts.host = host; 154 ts.host = host;
145 155
146 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); 156 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
157
158 AddSenseRepeater(ts);
159 }
160
161 private void AddSenseRepeater(SenseRepeatClass senseRepeater)
162 {
147 lock (SenseRepeatListLock) 163 lock (SenseRepeatListLock)
148 { 164 {
149 SenseRepeaters.Add(ts); 165 List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>(SenseRepeaters);
166 newSenseRepeaters.Add(senseRepeater);
167 SenseRepeaters = newSenseRepeaters;
150 } 168 }
151 } 169 }
152 170
@@ -155,39 +173,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
155 // Remove from timer 173 // Remove from timer
156 lock (SenseRepeatListLock) 174 lock (SenseRepeatListLock)
157 { 175 {
158 List<SenseRepeatClass> NewSensors = new List<SenseRepeatClass>(); 176 List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>();
159 foreach (SenseRepeatClass ts in SenseRepeaters) 177 foreach (SenseRepeatClass ts in SenseRepeaters)
160 { 178 {
161 if (ts.localID != m_localID || ts.itemID != m_itemID) 179 if (ts.localID != m_localID || ts.itemID != m_itemID)
162 { 180 {
163 NewSensors.Add(ts); 181 newSenseRepeaters.Add(ts);
164 } 182 }
165 } 183 }
166 SenseRepeaters.Clear(); 184
167 SenseRepeaters = NewSensors; 185 SenseRepeaters = newSenseRepeaters;
168 } 186 }
169 } 187 }
170 188
171 public void CheckSenseRepeaterEvents() 189 public void CheckSenseRepeaterEvents()
172 { 190 {
173 lock (SenseRepeatListLock) 191 // Go through all timers
192 foreach (SenseRepeatClass ts in SenseRepeaters)
174 { 193 {
175 // Nothing to do here? 194 // Time has passed?
176 if (SenseRepeaters.Count == 0) 195 if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
177 return;
178
179 // Go through all timers
180 foreach (SenseRepeatClass ts in SenseRepeaters)
181 { 196 {
182 // Time has passed? 197 SensorSweep(ts);
183 if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) 198 // set next interval
184 { 199 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
185 SensorSweep(ts);
186 // set next interval
187 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
188 }
189 } 200 }
190 } // lock 201 }
191 } 202 }
192 203
193 public void SenseOnce(uint m_localID, UUID m_itemID, 204 public void SenseOnce(uint m_localID, UUID m_itemID,
@@ -615,21 +626,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
615 { 626 {
616 List<Object> data = new List<Object>(); 627 List<Object> data = new List<Object>();
617 628
618 lock (SenseRepeatListLock) 629 foreach (SenseRepeatClass ts in SenseRepeaters)
619 { 630 {
620 foreach (SenseRepeatClass ts in SenseRepeaters) 631 if (ts.itemID == itemID)
621 { 632 {
622 if (ts.itemID == itemID) 633 data.Add(ts.interval);
623 { 634 data.Add(ts.name);
624 data.Add(ts.interval); 635 data.Add(ts.keyID);
625 data.Add(ts.name); 636 data.Add(ts.type);
626 data.Add(ts.keyID); 637 data.Add(ts.range);
627 data.Add(ts.type); 638 data.Add(ts.arc);
628 data.Add(ts.range);
629 data.Add(ts.arc);
630 }
631 } 639 }
632 } 640 }
641
633 return data.ToArray(); 642 return data.ToArray();
634 } 643 }
635 644
@@ -663,8 +672,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
663 ts.next = 672 ts.next =
664 DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); 673 DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
665 674
666 lock (SenseRepeatListLock) 675 AddSenseRepeater(ts);
667 SenseRepeaters.Add(ts);
668 676
669 idx += 6; 677 idx += 6;
670 } 678 }