diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
7 files changed, 243 insertions, 184 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index 35ae44c..b9a217b 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -51,7 +51,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
51 | public interface IScriptWorkItem | 51 | public interface IScriptWorkItem |
52 | { | 52 | { |
53 | bool Cancel(); | 53 | bool Cancel(); |
54 | void Abort(); | 54 | bool Abort(); |
55 | 55 | ||
56 | /// <summary> | 56 | /// <summary> |
57 | /// Wait for the work item to complete. | 57 | /// Wait for the work item to complete. |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs index 6879ebb..1e19032 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs | |||
@@ -37,6 +37,8 @@ using OpenSim.Region.ScriptEngine.Interfaces; | |||
37 | using OpenSim.Region.ScriptEngine.Shared; | 37 | using OpenSim.Region.ScriptEngine.Shared; |
38 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; | 38 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; |
39 | using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; | 39 | using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; |
40 | using System.Reflection; | ||
41 | using log4net; | ||
40 | 42 | ||
41 | namespace OpenSim.Region.ScriptEngine.Shared.Api | 43 | namespace OpenSim.Region.ScriptEngine.Shared.Api |
42 | { | 44 | { |
@@ -45,15 +47,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
45 | /// </summary> | 47 | /// </summary> |
46 | public class AsyncCommandManager | 48 | public class AsyncCommandManager |
47 | { | 49 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
51 | |||
48 | private static Thread cmdHandlerThread; | 52 | private static Thread cmdHandlerThread; |
49 | private static int cmdHandlerThreadCycleSleepms; | 53 | private static int cmdHandlerThreadCycleSleepms; |
50 | 54 | ||
51 | private static List<IScene> m_Scenes = new List<IScene>(); | 55 | /// <summary> |
56 | /// Lock for reading/writing static components of AsyncCommandManager. | ||
57 | /// </summary> | ||
58 | /// <remarks> | ||
59 | /// This lock exists so that multiple threads from different engines and/or different copies of the same engine | ||
60 | /// are prevented from running non-thread safe code (e.g. read/write of lists) concurrently. | ||
61 | /// </remarks> | ||
62 | private static object staticLock = new object(); | ||
63 | |||
52 | private static List<IScriptEngine> m_ScriptEngines = | 64 | private static List<IScriptEngine> m_ScriptEngines = |
53 | new List<IScriptEngine>(); | 65 | new List<IScriptEngine>(); |
54 | 66 | ||
55 | public IScriptEngine m_ScriptEngine; | 67 | public IScriptEngine m_ScriptEngine; |
56 | private IScene m_Scene; | ||
57 | 68 | ||
58 | private static Dictionary<IScriptEngine, Dataserver> m_Dataserver = | 69 | private static Dictionary<IScriptEngine, Dataserver> m_Dataserver = |
59 | new Dictionary<IScriptEngine, Dataserver>(); | 70 | new Dictionary<IScriptEngine, Dataserver>(); |
@@ -70,67 +81,99 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
70 | 81 | ||
71 | public Dataserver DataserverPlugin | 82 | public Dataserver DataserverPlugin |
72 | { | 83 | { |
73 | get { return m_Dataserver[m_ScriptEngine]; } | 84 | get |
85 | { | ||
86 | lock (staticLock) | ||
87 | return m_Dataserver[m_ScriptEngine]; | ||
88 | } | ||
74 | } | 89 | } |
75 | 90 | ||
76 | public Timer TimerPlugin | 91 | public Timer TimerPlugin |
77 | { | 92 | { |
78 | get { return m_Timer[m_ScriptEngine]; } | 93 | get |
94 | { | ||
95 | lock (staticLock) | ||
96 | return m_Timer[m_ScriptEngine]; | ||
97 | } | ||
79 | } | 98 | } |
80 | 99 | ||
81 | public HttpRequest HttpRequestPlugin | 100 | public HttpRequest HttpRequestPlugin |
82 | { | 101 | { |
83 | get { return m_HttpRequest[m_ScriptEngine]; } | 102 | get |
103 | { | ||
104 | lock (staticLock) | ||
105 | return m_HttpRequest[m_ScriptEngine]; | ||
106 | } | ||
84 | } | 107 | } |
85 | 108 | ||
86 | public Listener ListenerPlugin | 109 | public Listener ListenerPlugin |
87 | { | 110 | { |
88 | get { return m_Listener[m_ScriptEngine]; } | 111 | get |
112 | { | ||
113 | lock (staticLock) | ||
114 | return m_Listener[m_ScriptEngine]; | ||
115 | } | ||
89 | } | 116 | } |
90 | 117 | ||
91 | public SensorRepeat SensorRepeatPlugin | 118 | public SensorRepeat SensorRepeatPlugin |
92 | { | 119 | { |
93 | get { return m_SensorRepeat[m_ScriptEngine]; } | 120 | get |
121 | { | ||
122 | lock (staticLock) | ||
123 | return m_SensorRepeat[m_ScriptEngine]; | ||
124 | } | ||
94 | } | 125 | } |
95 | 126 | ||
96 | public XmlRequest XmlRequestPlugin | 127 | public XmlRequest XmlRequestPlugin |
97 | { | 128 | { |
98 | get { return m_XmlRequest[m_ScriptEngine]; } | 129 | get |
130 | { | ||
131 | lock (staticLock) | ||
132 | return m_XmlRequest[m_ScriptEngine]; | ||
133 | } | ||
99 | } | 134 | } |
100 | 135 | ||
101 | public IScriptEngine[] ScriptEngines | 136 | public IScriptEngine[] ScriptEngines |
102 | { | 137 | { |
103 | get { return m_ScriptEngines.ToArray(); } | 138 | get |
139 | { | ||
140 | lock (staticLock) | ||
141 | return m_ScriptEngines.ToArray(); | ||
142 | } | ||
104 | } | 143 | } |
105 | 144 | ||
106 | public AsyncCommandManager(IScriptEngine _ScriptEngine) | 145 | public AsyncCommandManager(IScriptEngine _ScriptEngine) |
107 | { | 146 | { |
108 | m_ScriptEngine = _ScriptEngine; | 147 | m_ScriptEngine = _ScriptEngine; |
109 | m_Scene = m_ScriptEngine.World; | 148 | |
110 | 149 | // If there is more than one scene in the simulator or multiple script engines are used on the same region | |
111 | if (m_Scenes.Count == 0) | 150 | // then more than one thread could arrive at this block of code simultaneously. However, it cannot be |
112 | ReadConfig(); | 151 | // executed concurrently both because concurrent list operations are not thread-safe and because of other |
113 | 152 | // race conditions such as the later check of cmdHandlerThread == null. | |
114 | if (!m_Scenes.Contains(m_Scene)) | 153 | lock (staticLock) |
115 | m_Scenes.Add(m_Scene); | 154 | { |
116 | if (!m_ScriptEngines.Contains(m_ScriptEngine)) | 155 | if (m_ScriptEngines.Count == 0) |
117 | m_ScriptEngines.Add(m_ScriptEngine); | 156 | ReadConfig(); |
118 | 157 | ||
119 | // Create instances of all plugins | 158 | if (!m_ScriptEngines.Contains(m_ScriptEngine)) |
120 | if (!m_Dataserver.ContainsKey(m_ScriptEngine)) | 159 | m_ScriptEngines.Add(m_ScriptEngine); |
121 | m_Dataserver[m_ScriptEngine] = new Dataserver(this); | 160 | |
122 | if (!m_Timer.ContainsKey(m_ScriptEngine)) | 161 | // Create instances of all plugins |
123 | m_Timer[m_ScriptEngine] = new Timer(this); | 162 | if (!m_Dataserver.ContainsKey(m_ScriptEngine)) |
124 | if (!m_HttpRequest.ContainsKey(m_ScriptEngine)) | 163 | m_Dataserver[m_ScriptEngine] = new Dataserver(this); |
125 | m_HttpRequest[m_ScriptEngine] = new HttpRequest(this); | 164 | if (!m_Timer.ContainsKey(m_ScriptEngine)) |
126 | if (!m_Listener.ContainsKey(m_ScriptEngine)) | 165 | m_Timer[m_ScriptEngine] = new Timer(this); |
127 | m_Listener[m_ScriptEngine] = new Listener(this); | 166 | if (!m_HttpRequest.ContainsKey(m_ScriptEngine)) |
128 | if (!m_SensorRepeat.ContainsKey(m_ScriptEngine)) | 167 | m_HttpRequest[m_ScriptEngine] = new HttpRequest(this); |
129 | m_SensorRepeat[m_ScriptEngine] = new SensorRepeat(this); | 168 | if (!m_Listener.ContainsKey(m_ScriptEngine)) |
130 | if (!m_XmlRequest.ContainsKey(m_ScriptEngine)) | 169 | m_Listener[m_ScriptEngine] = new Listener(this); |
131 | m_XmlRequest[m_ScriptEngine] = new XmlRequest(this); | 170 | if (!m_SensorRepeat.ContainsKey(m_ScriptEngine)) |
132 | 171 | m_SensorRepeat[m_ScriptEngine] = new SensorRepeat(this); | |
133 | StartThread(); | 172 | if (!m_XmlRequest.ContainsKey(m_ScriptEngine)) |
173 | m_XmlRequest[m_ScriptEngine] = new XmlRequest(this); | ||
174 | |||
175 | StartThread(); | ||
176 | } | ||
134 | } | 177 | } |
135 | 178 | ||
136 | private static void StartThread() | 179 | private static void StartThread() |
@@ -179,42 +222,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
179 | { | 222 | { |
180 | try | 223 | try |
181 | { | 224 | { |
182 | while (true) | 225 | Thread.Sleep(cmdHandlerThreadCycleSleepms); |
183 | { | ||
184 | Thread.Sleep(cmdHandlerThreadCycleSleepms); | ||
185 | 226 | ||
186 | DoOneCmdHandlerPass(); | 227 | DoOneCmdHandlerPass(); |
187 | 228 | ||
188 | Watchdog.UpdateThread(); | 229 | Watchdog.UpdateThread(); |
189 | } | ||
190 | } | 230 | } |
191 | catch | 231 | catch (Exception e) |
192 | { | 232 | { |
233 | m_log.Error("[ASYNC COMMAND MANAGER]: Exception in command handler pass: ", e); | ||
193 | } | 234 | } |
194 | } | 235 | } |
195 | } | 236 | } |
196 | 237 | ||
197 | private static void DoOneCmdHandlerPass() | 238 | private static void DoOneCmdHandlerPass() |
198 | { | 239 | { |
199 | // Check HttpRequests | 240 | lock (staticLock) |
200 | m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests(); | 241 | { |
242 | // Check HttpRequests | ||
243 | m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests(); | ||
201 | 244 | ||
202 | // Check XMLRPCRequests | 245 | // Check XMLRPCRequests |
203 | m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests(); | 246 | m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests(); |
204 | 247 | ||
205 | foreach (IScriptEngine s in m_ScriptEngines) | 248 | foreach (IScriptEngine s in m_ScriptEngines) |
206 | { | 249 | { |
207 | // Check Listeners | 250 | // Check Listeners |
208 | m_Listener[s].CheckListeners(); | 251 | m_Listener[s].CheckListeners(); |
209 | 252 | ||
210 | // Check timers | 253 | // Check timers |
211 | m_Timer[s].CheckTimerEvents(); | 254 | m_Timer[s].CheckTimerEvents(); |
212 | 255 | ||
213 | // Check Sensors | 256 | // Check Sensors |
214 | m_SensorRepeat[s].CheckSenseRepeaterEvents(); | 257 | m_SensorRepeat[s].CheckSenseRepeaterEvents(); |
215 | 258 | ||
216 | // Check dataserver | 259 | // Check dataserver |
217 | m_Dataserver[s].ExpireRequests(); | 260 | m_Dataserver[s].ExpireRequests(); |
261 | } | ||
218 | } | 262 | } |
219 | } | 263 | } |
220 | 264 | ||
@@ -226,31 +270,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
226 | public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) | 270 | public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) |
227 | { | 271 | { |
228 | // Remove a specific script | 272 | // Remove a specific script |
273 | // m_log.DebugFormat("[ASYNC COMMAND MANAGER]: Removing facilities for script {0}", itemID); | ||
229 | 274 | ||
230 | // Remove dataserver events | 275 | lock (staticLock) |
231 | m_Dataserver[engine].RemoveEvents(localID, itemID); | 276 | { |
277 | // Remove dataserver events | ||
278 | m_Dataserver[engine].RemoveEvents(localID, itemID); | ||
232 | 279 | ||
233 | // Remove from: Timers | 280 | // Remove from: Timers |
234 | m_Timer[engine].UnSetTimerEvents(localID, itemID); | 281 | m_Timer[engine].UnSetTimerEvents(localID, itemID); |
235 | 282 | ||
236 | // Remove from: HttpRequest | 283 | // Remove from: HttpRequest |
237 | IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>(); | 284 | IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>(); |
238 | if (iHttpReq != null) | 285 | if (iHttpReq != null) |
239 | iHttpReq.StopHttpRequest(localID, itemID); | 286 | iHttpReq.StopHttpRequest(localID, itemID); |
240 | 287 | ||
241 | IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); | 288 | IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); |
242 | if (comms != null) | 289 | if (comms != null) |
243 | comms.DeleteListener(itemID); | 290 | comms.DeleteListener(itemID); |
244 | 291 | ||
245 | IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>(); | 292 | IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>(); |
246 | if (xmlrpc != null) | 293 | if (xmlrpc != null) |
247 | { | 294 | { |
248 | xmlrpc.DeleteChannels(itemID); | 295 | xmlrpc.DeleteChannels(itemID); |
249 | xmlrpc.CancelSRDRequests(itemID); | 296 | xmlrpc.CancelSRDRequests(itemID); |
250 | } | 297 | } |
251 | 298 | ||
252 | // Remove Sensors | 299 | // Remove Sensors |
253 | m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); | 300 | m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); |
301 | } | ||
254 | } | 302 | } |
255 | 303 | ||
256 | /// <summary> | 304 | /// <summary> |
@@ -260,10 +308,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
260 | /// <returns></returns> | 308 | /// <returns></returns> |
261 | public static SensorRepeat GetSensorRepeatPlugin(IScriptEngine engine) | 309 | public static SensorRepeat GetSensorRepeatPlugin(IScriptEngine engine) |
262 | { | 310 | { |
263 | if (m_SensorRepeat.ContainsKey(engine)) | 311 | lock (staticLock) |
264 | return m_SensorRepeat[engine]; | 312 | { |
265 | else | 313 | if (m_SensorRepeat.ContainsKey(engine)) |
266 | return null; | 314 | return m_SensorRepeat[engine]; |
315 | else | ||
316 | return null; | ||
317 | } | ||
267 | } | 318 | } |
268 | 319 | ||
269 | /// <summary> | 320 | /// <summary> |
@@ -273,10 +324,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
273 | /// <returns></returns> | 324 | /// <returns></returns> |
274 | public static Dataserver GetDataserverPlugin(IScriptEngine engine) | 325 | public static Dataserver GetDataserverPlugin(IScriptEngine engine) |
275 | { | 326 | { |
276 | if (m_Dataserver.ContainsKey(engine)) | 327 | lock (staticLock) |
277 | return m_Dataserver[engine]; | 328 | { |
278 | else | 329 | if (m_Dataserver.ContainsKey(engine)) |
279 | return null; | 330 | return m_Dataserver[engine]; |
331 | else | ||
332 | return null; | ||
333 | } | ||
280 | } | 334 | } |
281 | 335 | ||
282 | /// <summary> | 336 | /// <summary> |
@@ -286,10 +340,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
286 | /// <returns></returns> | 340 | /// <returns></returns> |
287 | public static Timer GetTimerPlugin(IScriptEngine engine) | 341 | public static Timer GetTimerPlugin(IScriptEngine engine) |
288 | { | 342 | { |
289 | if (m_Timer.ContainsKey(engine)) | 343 | lock (staticLock) |
290 | return m_Timer[engine]; | 344 | { |
291 | else | 345 | if (m_Timer.ContainsKey(engine)) |
292 | return null; | 346 | return m_Timer[engine]; |
347 | else | ||
348 | return null; | ||
349 | } | ||
293 | } | 350 | } |
294 | 351 | ||
295 | /// <summary> | 352 | /// <summary> |
@@ -299,10 +356,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
299 | /// <returns></returns> | 356 | /// <returns></returns> |
300 | public static Listener GetListenerPlugin(IScriptEngine engine) | 357 | public static Listener GetListenerPlugin(IScriptEngine engine) |
301 | { | 358 | { |
302 | if (m_Listener.ContainsKey(engine)) | 359 | lock (staticLock) |
303 | return m_Listener[engine]; | 360 | { |
304 | else | 361 | if (m_Listener.ContainsKey(engine)) |
305 | return null; | 362 | return m_Listener[engine]; |
363 | else | ||
364 | return null; | ||
365 | } | ||
306 | } | 366 | } |
307 | 367 | ||
308 | public static void StateChange(IScriptEngine engine, uint localID, UUID itemID) | 368 | public static void StateChange(IScriptEngine engine, uint localID, UUID itemID) |
@@ -332,28 +392,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
332 | { | 392 | { |
333 | List<Object> data = new List<Object>(); | 393 | List<Object> data = new List<Object>(); |
334 | 394 | ||
335 | Object[] listeners = m_Listener[engine].GetSerializationData(itemID); | 395 | lock (staticLock) |
336 | if (listeners.Length > 0) | ||
337 | { | 396 | { |
338 | data.Add("listener"); | 397 | Object[] listeners = m_Listener[engine].GetSerializationData(itemID); |
339 | data.Add(listeners.Length); | 398 | if (listeners.Length > 0) |
340 | data.AddRange(listeners); | 399 | { |
341 | } | 400 | data.Add("listener"); |
401 | data.Add(listeners.Length); | ||
402 | data.AddRange(listeners); | ||
403 | } | ||
342 | 404 | ||
343 | Object[] timers=m_Timer[engine].GetSerializationData(itemID); | 405 | Object[] timers=m_Timer[engine].GetSerializationData(itemID); |
344 | if (timers.Length > 0) | 406 | if (timers.Length > 0) |
345 | { | 407 | { |
346 | data.Add("timer"); | 408 | data.Add("timer"); |
347 | data.Add(timers.Length); | 409 | data.Add(timers.Length); |
348 | data.AddRange(timers); | 410 | data.AddRange(timers); |
349 | } | 411 | } |
350 | 412 | ||
351 | Object[] sensors = m_SensorRepeat[engine].GetSerializationData(itemID); | 413 | Object[] sensors = m_SensorRepeat[engine].GetSerializationData(itemID); |
352 | if (sensors.Length > 0) | 414 | if (sensors.Length > 0) |
353 | { | 415 | { |
354 | data.Add("sensor"); | 416 | data.Add("sensor"); |
355 | data.Add(sensors.Length); | 417 | data.Add(sensors.Length); |
356 | data.AddRange(sensors); | 418 | data.AddRange(sensors); |
419 | } | ||
357 | } | 420 | } |
358 | 421 | ||
359 | return data.ToArray(); | 422 | return data.ToArray(); |
@@ -378,41 +441,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
378 | 441 | ||
379 | idx+=len; | 442 | idx+=len; |
380 | 443 | ||
444 | lock (staticLock) | ||
445 | { | ||
381 | switch (type) | 446 | switch (type) |
382 | { | 447 | { |
383 | case "listener": | 448 | case "listener": |
384 | m_Listener[engine].CreateFromData(localID, itemID, | 449 | m_Listener[engine].CreateFromData(localID, itemID, |
385 | hostID, item); | 450 | hostID, item); |
386 | break; | 451 | break; |
387 | case "timer": | 452 | case "timer": |
388 | m_Timer[engine].CreateFromData(localID, itemID, | 453 | m_Timer[engine].CreateFromData(localID, itemID, |
389 | hostID, item); | 454 | hostID, item); |
390 | break; | 455 | break; |
391 | case "sensor": | 456 | case "sensor": |
392 | m_SensorRepeat[engine].CreateFromData(localID, | 457 | m_SensorRepeat[engine].CreateFromData(localID, |
393 | itemID, hostID, item); | 458 | itemID, hostID, item); |
394 | break; | 459 | break; |
460 | } | ||
395 | } | 461 | } |
396 | } | 462 | } |
397 | } | 463 | } |
398 | } | 464 | } |
399 | |||
400 | #region Check llRemoteData channels | ||
401 | |||
402 | #endregion | ||
403 | |||
404 | #region Check llListeners | ||
405 | |||
406 | #endregion | ||
407 | |||
408 | /// <summary> | ||
409 | /// If set to true then threads and stuff should try to make a graceful exit | ||
410 | /// </summary> | ||
411 | public bool PleaseShutdown | ||
412 | { | ||
413 | get { return _PleaseShutdown; } | ||
414 | set { _PleaseShutdown = value; } | ||
415 | } | ||
416 | private bool _PleaseShutdown = false; | ||
417 | } | 465 | } |
418 | } | 466 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5ea14c7..7c375e6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2772,9 +2772,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2772 | // send the sound, once, to all clients in range | 2772 | // send the sound, once, to all clients in range |
2773 | if (m_SoundModule != null) | 2773 | if (m_SoundModule != null) |
2774 | { | 2774 | { |
2775 | m_SoundModule.SendSound(m_host.UUID, | 2775 | m_SoundModule.SendSound( |
2776 | ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, false, 0, | 2776 | m_host.UUID, |
2777 | 0, false, false); | 2777 | ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), |
2778 | volume, false, m_host.SoundQueueing ? (byte)SoundFlags.Queue : (byte)SoundFlags.None, | ||
2779 | 0, false, false); | ||
2778 | } | 2780 | } |
2779 | } | 2781 | } |
2780 | 2782 | ||
@@ -12672,6 +12674,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12672 | public void llSetSoundQueueing(int queue) | 12674 | public void llSetSoundQueueing(int queue) |
12673 | { | 12675 | { |
12674 | m_host.AddScriptLPS(1); | 12676 | m_host.AddScriptLPS(1); |
12677 | |||
12678 | if (m_SoundModule != null) | ||
12679 | m_SoundModule.SetSoundQueueing(m_host.UUID, queue == ScriptBaseClass.TRUE.value); | ||
12675 | } | 12680 | } |
12676 | 12681 | ||
12677 | public void llCollisionSprite(string impact_sprite) | 12682 | public void llCollisionSprite(string impact_sprite) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 26850c4..8da06d1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -528,8 +528,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
528 | { | 528 | { |
529 | File.Delete(savedState); | 529 | File.Delete(savedState); |
530 | } | 530 | } |
531 | catch(Exception) | 531 | catch (Exception e) |
532 | { | 532 | { |
533 | m_log.Warn( | ||
534 | string.Format( | ||
535 | "[SCRIPT INSTANCE]: Could not delete script state {0} for script {1} (id {2}) in part {3} (id {4}) in object {5} in {6}. Exception ", | ||
536 | ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name), | ||
537 | e); | ||
533 | } | 538 | } |
534 | } | 539 | } |
535 | 540 | ||
@@ -567,9 +572,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
567 | 572 | ||
568 | public bool Stop(int timeout) | 573 | public bool Stop(int timeout) |
569 | { | 574 | { |
570 | // m_log.DebugFormat( | 575 | if (DebugLevel >= 1) |
571 | // "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}", | 576 | m_log.DebugFormat( |
572 | // ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks); | 577 | "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}", |
578 | ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks); | ||
573 | 579 | ||
574 | IScriptWorkItem workItem; | 580 | IScriptWorkItem workItem; |
575 | 581 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index b524a18..3e69ab9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs | |||
@@ -546,21 +546,33 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
546 | 546 | ||
547 | set {m_data = value; } | 547 | set {m_data = value; } |
548 | } | 548 | } |
549 | // Function to obtain LSL type from an index. This is needed | 549 | |
550 | // because LSL lists allow for multiple types, and safely | 550 | /// <summary> |
551 | // iterating in them requires a type check. | 551 | /// Obtain LSL type from an index. |
552 | /// </summary> | ||
553 | /// <remarks> | ||
554 | /// This is needed because LSL lists allow for multiple types, and safely | ||
555 | /// iterating in them requires a type check. | ||
556 | /// </remarks> | ||
557 | /// <returns></returns> | ||
558 | /// <param name='itemIndex'></param> | ||
552 | public Type GetLSLListItemType(int itemIndex) | 559 | public Type GetLSLListItemType(int itemIndex) |
553 | { | 560 | { |
554 | return m_data[itemIndex].GetType(); | 561 | return m_data[itemIndex].GetType(); |
555 | } | 562 | } |
556 | 563 | ||
557 | // Member functions to obtain item as specific types. | 564 | /// <summary> |
558 | // For cases where implicit conversions would apply if items | 565 | /// Obtain float from an index. |
559 | // were not in a list (e.g. integer to float, but not float | 566 | /// </summary> |
560 | // to integer) functions check for alternate types so as to | 567 | /// <remarks> |
561 | // down-cast from Object to the correct type. | 568 | /// For cases where implicit conversions would apply if items |
562 | // Note: no checks for item index being valid are performed | 569 | /// were not in a list (e.g. integer to float, but not float |
563 | 570 | /// to integer) functions check for alternate types so as to | |
571 | /// down-cast from Object to the correct type. | ||
572 | /// Note: no checks for item index being valid are performed | ||
573 | /// </remarks> | ||
574 | /// <returns></returns> | ||
575 | /// <param name='itemIndex'></param> | ||
564 | public LSL_Types.LSLFloat GetLSLFloatItem(int itemIndex) | 576 | public LSL_Types.LSLFloat GetLSLFloatItem(int itemIndex) |
565 | { | 577 | { |
566 | if (m_data[itemIndex] is LSL_Types.LSLInteger) | 578 | if (m_data[itemIndex] is LSL_Types.LSLInteger) |
@@ -591,26 +603,14 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
591 | 603 | ||
592 | public LSL_Types.LSLString GetLSLStringItem(int itemIndex) | 604 | public LSL_Types.LSLString GetLSLStringItem(int itemIndex) |
593 | { | 605 | { |
594 | if (m_data[itemIndex] is LSL_Types.key) | 606 | if (m_data[itemIndex] is LSL_Types.key) |
595 | { | 607 | { |
596 | return (LSL_Types.key)m_data[itemIndex]; | 608 | return (LSL_Types.key)m_data[itemIndex]; |
597 | } | 609 | } |
598 | else if (m_data[itemIndex] is String) | 610 | else |
599 | { | 611 | { |
600 | return new LSL_Types.LSLString((string)m_data[itemIndex]); | 612 | return new LSL_Types.LSLString(m_data[itemIndex].ToString()); |
601 | } | 613 | } |
602 | else if (m_data[itemIndex] is LSL_Types.LSLFloat) | ||
603 | { | ||
604 | return new LSL_Types.LSLString((LSLFloat)m_data[itemIndex]); | ||
605 | } | ||
606 | else if (m_data[itemIndex] is LSL_Types.LSLInteger) | ||
607 | { | ||
608 | return new LSL_Types.LSLString((LSLInteger)m_data[itemIndex]); | ||
609 | } | ||
610 | else | ||
611 | { | ||
612 | return (LSL_Types.LSLString)m_data[itemIndex]; | ||
613 | } | ||
614 | } | 614 | } |
615 | 615 | ||
616 | public LSL_Types.LSLInteger GetLSLIntegerItem(int itemIndex) | 616 | public LSL_Types.LSLInteger GetLSLIntegerItem(int itemIndex) |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 17243ab..9d1e143 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -551,7 +551,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
551 | /// <param name="instance"></param> | 551 | /// <param name="instance"></param> |
552 | /// <param name="keySelector">Basis on which to sort output. Can be null if no sort needs to take place</param> | 552 | /// <param name="keySelector">Basis on which to sort output. Can be null if no sort needs to take place</param> |
553 | private void HandleScriptsAction<TKey>( | 553 | private void HandleScriptsAction<TKey>( |
554 | string[] cmdparams, Action<IScriptInstance> action, Func<IScriptInstance, TKey> keySelector) | 554 | string[] cmdparams, Action<IScriptInstance> action, System.Func<IScriptInstance, TKey> keySelector) |
555 | { | 555 | { |
556 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) | 556 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) |
557 | return; | 557 | return; |
@@ -609,7 +609,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
609 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) | 609 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) |
610 | return; | 610 | return; |
611 | 611 | ||
612 | MainConsole.Instance.OutputFormat(GetStatusReport()); | 612 | MainConsole.Instance.Output(GetStatusReport()); |
613 | } | 613 | } |
614 | 614 | ||
615 | public string GetStatusReport() | 615 | public string GetStatusReport() |
@@ -708,7 +708,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
708 | sb.AppendFormat("Containing part UUID: {0}\n", instance.ObjectID); | 708 | sb.AppendFormat("Containing part UUID: {0}\n", instance.ObjectID); |
709 | sb.AppendFormat("Position : {0}\n", sop.AbsolutePosition); | 709 | sb.AppendFormat("Position : {0}\n", sop.AbsolutePosition); |
710 | 710 | ||
711 | MainConsole.Instance.OutputFormat(sb.ToString()); | 711 | MainConsole.Instance.Output(sb.ToString()); |
712 | } | 712 | } |
713 | 713 | ||
714 | private void HandleSuspendScript(IScriptInstance instance) | 714 | private void HandleSuspendScript(IScriptInstance instance) |
@@ -1599,7 +1599,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1599 | startInfo.MaxWorkerThreads = maxThreads; | 1599 | startInfo.MaxWorkerThreads = maxThreads; |
1600 | startInfo.MinWorkerThreads = minThreads; | 1600 | startInfo.MinWorkerThreads = minThreads; |
1601 | startInfo.ThreadPriority = threadPriority;; | 1601 | startInfo.ThreadPriority = threadPriority;; |
1602 | startInfo.StackSize = stackSize; | 1602 | startInfo.MaxStackSize = stackSize; |
1603 | startInfo.StartSuspended = true; | 1603 | startInfo.StartSuspended = true; |
1604 | 1604 | ||
1605 | m_ThreadPool = new SmartThreadPool(startInfo); | 1605 | m_ThreadPool = new SmartThreadPool(startInfo); |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs index 8dd7677..9d9dee1 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs | |||
@@ -52,16 +52,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
52 | return wr.Cancel(); | 52 | return wr.Cancel(); |
53 | } | 53 | } |
54 | 54 | ||
55 | public void Abort() | 55 | public bool Abort() |
56 | { | 56 | { |
57 | wr.Abort(); | 57 | return wr.Cancel(true); |
58 | } | 58 | } |
59 | 59 | ||
60 | public bool Wait(int t) | 60 | public bool Wait(int t) |
61 | { | 61 | { |
62 | // We use the integer version of WaitAll because the current version of SmartThreadPool has a bug with the | 62 | // We use the integer version of WaitAll because the current version of SmartThreadPool has a bug with the |
63 | // TimeSpan version. The number of milliseconds in TimeSpan is an int64 so when STP casts it down to an | 63 | // TimeSpan version. The number of milliseconds in TimeSpan is an int64 so when STP casts it down to an |
64 | // int (32-bit) we can end up with bad values. This occurs on Windows though curious not on Mono 2.10.8 | 64 | // int (32-bit) we can end up with bad values. This occurs on Windows though curiously not on Mono 2.10.8 |
65 | // (or very likely other versions of Mono at least up until 3.0.3). | 65 | // (or very likely other versions of Mono at least up until 3.0.3). |
66 | return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); | 66 | return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); |
67 | } | 67 | } |