diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/XEngine/XEngine.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 340 |
1 files changed, 300 insertions, 40 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index c8f6559..65c7416 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -42,7 +42,7 @@ using log4net; | |||
42 | using Nini.Config; | 42 | using Nini.Config; |
43 | using Amib.Threading; | 43 | using Amib.Threading; |
44 | using OpenSim.Framework; | 44 | using OpenSim.Framework; |
45 | using OpenSim.Region.CoreModules.Framework.EventQueue; | 45 | using OpenSim.Framework.Console; |
46 | using OpenSim.Region.Framework.Scenes; | 46 | using OpenSim.Region.Framework.Scenes; |
47 | using OpenSim.Region.Framework.Interfaces; | 47 | using OpenSim.Region.Framework.Interfaces; |
48 | using OpenSim.Region.ScriptEngine.Shared; | 48 | using OpenSim.Region.ScriptEngine.Shared; |
@@ -89,6 +89,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
89 | private IXmlRpcRouter m_XmlRpcRouter; | 89 | private IXmlRpcRouter m_XmlRpcRouter; |
90 | private int m_EventLimit; | 90 | private int m_EventLimit; |
91 | private bool m_KillTimedOutScripts; | 91 | private bool m_KillTimedOutScripts; |
92 | private string m_ScriptEnginesPath = null; | ||
93 | |||
94 | /// <summary> | ||
95 | /// Is the entire simulator in the process of shutting down? | ||
96 | /// </summary> | ||
97 | private bool m_SimulatorShuttingDown; | ||
92 | 98 | ||
93 | private static List<XEngine> m_ScriptEngines = | 99 | private static List<XEngine> m_ScriptEngines = |
94 | new List<XEngine>(); | 100 | new List<XEngine>(); |
@@ -224,6 +230,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
224 | get { return m_ScriptConfig; } | 230 | get { return m_ScriptConfig; } |
225 | } | 231 | } |
226 | 232 | ||
233 | public string ScriptEnginePath | ||
234 | { | ||
235 | get { return m_ScriptEnginesPath; } | ||
236 | } | ||
237 | |||
227 | public IConfigSource ConfigSource | 238 | public IConfigSource ConfigSource |
228 | { | 239 | { |
229 | get { return m_ConfigSource; } | 240 | get { return m_ConfigSource; } |
@@ -281,6 +292,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
281 | m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); | 292 | m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); |
282 | m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false); | 293 | m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false); |
283 | m_SaveTime = m_ScriptConfig.GetInt("SaveInterval", 120) * 1000; | 294 | m_SaveTime = m_ScriptConfig.GetInt("SaveInterval", 120) * 1000; |
295 | m_ScriptEnginesPath = m_ScriptConfig.GetString("ScriptEnginesPath", "ScriptEngines"); | ||
284 | 296 | ||
285 | m_Prio = ThreadPriority.BelowNormal; | 297 | m_Prio = ThreadPriority.BelowNormal; |
286 | switch (priority) | 298 | switch (priority) |
@@ -327,10 +339,185 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
327 | OnScriptRemoved += m_XmlRpcRouter.ScriptRemoved; | 339 | OnScriptRemoved += m_XmlRpcRouter.ScriptRemoved; |
328 | OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved; | 340 | OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved; |
329 | } | 341 | } |
342 | |||
343 | MainConsole.Instance.Commands.AddCommand( | ||
344 | "scripts", false, "scripts show", "scripts show", "Show script information", | ||
345 | "Show information on all scripts known to the script engine", HandleShowScripts); | ||
346 | |||
347 | MainConsole.Instance.Commands.AddCommand( | ||
348 | "scripts", false, "show scripts", "show scripts", "Show script information", | ||
349 | "Synonym for scripts show command", HandleShowScripts); | ||
350 | |||
351 | MainConsole.Instance.Commands.AddCommand( | ||
352 | "scripts", false, "scripts suspend", "scripts suspend [<script-item-uuid>]", "Suspends all running scripts", | ||
353 | "Suspends all currently running scripts. This only suspends event delivery, it will not suspend a" | ||
354 | + " script that is currently processing an event.\n" | ||
355 | + "Suspended scripts will continue to accumulate events but won't process them.\n" | ||
356 | + "If a <script-item-uuid> is given then only that script will be suspended. Otherwise, all suitable scripts are suspended.", | ||
357 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleSuspendScript)); | ||
358 | |||
359 | MainConsole.Instance.Commands.AddCommand( | ||
360 | "scripts", false, "scripts resume", "scripts resume [<script-item-uuid>]", "Resumes all suspended scripts", | ||
361 | "Resumes all currently suspended scripts.\n" | ||
362 | + "Resumed scripts will process all events accumulated whilst suspended." | ||
363 | + "If a <script-item-uuid> is given then only that script will be resumed. Otherwise, all suitable scripts are resumed.", | ||
364 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleResumeScript)); | ||
365 | |||
366 | MainConsole.Instance.Commands.AddCommand( | ||
367 | "scripts", false, "scripts stop", "scripts stop [<script-item-uuid>]", "Stops all running scripts", | ||
368 | "Stops all running scripts." | ||
369 | + "If a <script-item-uuid> is given then only that script will be stopped. Otherwise, all suitable scripts are stopped.", | ||
370 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStopScript)); | ||
371 | |||
372 | MainConsole.Instance.Commands.AddCommand( | ||
373 | "scripts", false, "scripts start", "scripts start [<script-item-uuid>]", "Starts all stopped scripts", | ||
374 | "Starts all stopped scripts." | ||
375 | + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.", | ||
376 | (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript)); | ||
377 | } | ||
378 | |||
379 | public void HandleShowScripts(string module, string[] cmdparams) | ||
380 | { | ||
381 | lock (m_Scripts) | ||
382 | { | ||
383 | MainConsole.Instance.OutputFormat( | ||
384 | "Showing {0} scripts in {1}", m_Scripts.Count, m_Scene.RegionInfo.RegionName); | ||
385 | |||
386 | foreach (IScriptInstance instance in m_Scripts.Values) | ||
387 | { | ||
388 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
389 | string status; | ||
390 | |||
391 | if (instance.ShuttingDown) | ||
392 | { | ||
393 | status = "shutting down"; | ||
394 | } | ||
395 | else if (instance.Suspended) | ||
396 | { | ||
397 | status = "suspended"; | ||
398 | } | ||
399 | else if (!instance.Running) | ||
400 | { | ||
401 | status = "stopped"; | ||
402 | } | ||
403 | else | ||
404 | { | ||
405 | status = "running"; | ||
406 | } | ||
407 | |||
408 | MainConsole.Instance.OutputFormat( | ||
409 | "{0}.{1}, item UUID {2}, prim UUID {3} @ {4} ({5})", | ||
410 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, | ||
411 | sop.AbsolutePosition, status); | ||
412 | } | ||
413 | } | ||
414 | } | ||
415 | |||
416 | /// <summary> | ||
417 | /// Parse the raw item id into a script instance from the command params if it's present. | ||
418 | /// </summary> | ||
419 | /// <param name="cmdparams"></param> | ||
420 | /// <param name="instance"></param> | ||
421 | /// <returns>true if we're okay to proceed, false if not.</returns> | ||
422 | private void HandleScriptsAction(string[] cmdparams, Action<IScriptInstance> action) | ||
423 | { | ||
424 | lock (m_Scripts) | ||
425 | { | ||
426 | string rawItemId; | ||
427 | UUID itemId = UUID.Zero; | ||
428 | |||
429 | if (cmdparams.Length == 2) | ||
430 | { | ||
431 | foreach (IScriptInstance instance in m_Scripts.Values) | ||
432 | action(instance); | ||
433 | |||
434 | return; | ||
435 | } | ||
436 | |||
437 | rawItemId = cmdparams[2]; | ||
438 | |||
439 | if (!UUID.TryParse(rawItemId, out itemId)) | ||
440 | { | ||
441 | MainConsole.Instance.OutputFormat("Error - {0} is not a valid UUID", rawItemId); | ||
442 | return; | ||
443 | } | ||
444 | |||
445 | if (itemId != UUID.Zero) | ||
446 | { | ||
447 | IScriptInstance instance = GetInstance(itemId); | ||
448 | if (instance == null) | ||
449 | { | ||
450 | // Commented out for now since this will cause false reports on simulators with more than | ||
451 | // one scene where the current command line set region is 'root' (which causes commands to | ||
452 | // go to both regions... (sigh) | ||
453 | // MainConsole.Instance.OutputFormat("Error - No item found with id {0}", itemId); | ||
454 | return; | ||
455 | } | ||
456 | else | ||
457 | { | ||
458 | action(instance); | ||
459 | return; | ||
460 | } | ||
461 | } | ||
462 | } | ||
463 | } | ||
464 | |||
465 | private void HandleSuspendScript(IScriptInstance instance) | ||
466 | { | ||
467 | if (!instance.Suspended) | ||
468 | { | ||
469 | instance.Suspend(); | ||
470 | |||
471 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
472 | MainConsole.Instance.OutputFormat( | ||
473 | "Suspended {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | ||
474 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | ||
475 | } | ||
476 | } | ||
477 | |||
478 | private void HandleResumeScript(IScriptInstance instance) | ||
479 | { | ||
480 | if (instance.Suspended) | ||
481 | { | ||
482 | instance.Resume(); | ||
483 | |||
484 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
485 | MainConsole.Instance.OutputFormat( | ||
486 | "Resumed {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | ||
487 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | ||
488 | } | ||
489 | } | ||
490 | |||
491 | private void HandleStartScript(IScriptInstance instance) | ||
492 | { | ||
493 | if (!instance.Running) | ||
494 | { | ||
495 | instance.Start(); | ||
496 | |||
497 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
498 | MainConsole.Instance.OutputFormat( | ||
499 | "Started {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | ||
500 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | ||
501 | } | ||
502 | } | ||
503 | |||
504 | private void HandleStopScript(IScriptInstance instance) | ||
505 | { | ||
506 | if (instance.Running) | ||
507 | { | ||
508 | instance.Stop(0); | ||
509 | |||
510 | SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); | ||
511 | MainConsole.Instance.OutputFormat( | ||
512 | "Stopped {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", | ||
513 | instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); | ||
514 | } | ||
330 | } | 515 | } |
331 | 516 | ||
332 | public void RemoveRegion(Scene scene) | 517 | public void RemoveRegion(Scene scene) |
333 | { | 518 | { |
519 | if (!m_Enabled) | ||
520 | return; | ||
334 | lockScriptsForRead(true); | 521 | lockScriptsForRead(true); |
335 | foreach (IScriptInstance instance in m_Scripts.Values) | 522 | foreach (IScriptInstance instance in m_Scripts.Values) |
336 | { | 523 | { |
@@ -355,12 +542,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
355 | // Must be done explicitly because they have infinite | 542 | // Must be done explicitly because they have infinite |
356 | // lifetime | 543 | // lifetime |
357 | // | 544 | // |
358 | m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); | 545 | if (!m_SimulatorShuttingDown) |
359 | if (m_DomainScripts[instance.AppDomain].Count == 0) | ||
360 | { | 546 | { |
361 | m_DomainScripts.Remove(instance.AppDomain); | 547 | m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); |
362 | UnloadAppDomain(instance.AppDomain); | 548 | if (m_DomainScripts[instance.AppDomain].Count == 0) |
549 | { | ||
550 | m_DomainScripts.Remove(instance.AppDomain); | ||
551 | UnloadAppDomain(instance.AppDomain); | ||
552 | } | ||
363 | } | 553 | } |
554 | |||
555 | m_Scripts.Clear(); | ||
556 | m_PrimObjects.Clear(); | ||
557 | m_Assemblies.Clear(); | ||
558 | m_DomainScripts.Clear(); | ||
364 | } | 559 | } |
365 | lockScriptsForRead(false); | 560 | lockScriptsForRead(false); |
366 | lockScriptsForWrite(true); | 561 | lockScriptsForWrite(true); |
@@ -403,12 +598,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
403 | m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup), | 598 | m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup), |
404 | new Object[] { m_SaveTime }); | 599 | new Object[] { m_SaveTime }); |
405 | } | 600 | } |
601 | } | ||
406 | 602 | ||
603 | public void StartProcessing() | ||
604 | { | ||
407 | m_ThreadPool.Start(); | 605 | m_ThreadPool.Start(); |
408 | } | 606 | } |
409 | 607 | ||
410 | public void Close() | 608 | public void Close() |
411 | { | 609 | { |
610 | if (!m_Enabled) | ||
611 | return; | ||
612 | |||
412 | lock (m_ScriptEngines) | 613 | lock (m_ScriptEngines) |
413 | { | 614 | { |
414 | if (m_ScriptEngines.Contains(this)) | 615 | if (m_ScriptEngines.Contains(this)) |
@@ -455,11 +656,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
455 | return 0; | 656 | return 0; |
456 | } | 657 | } |
457 | 658 | ||
458 | public object DoMaintenance(object p) | 659 | public void SaveAllState() |
459 | { | 660 | { |
460 | object[] parms = (object[])p; | ||
461 | int sleepTime = (int)parms[0]; | ||
462 | |||
463 | foreach (IScriptInstance inst in m_Scripts.Values) | 661 | foreach (IScriptInstance inst in m_Scripts.Values) |
464 | { | 662 | { |
465 | if (inst.EventTime() > m_EventLimit) | 663 | if (inst.EventTime() > m_EventLimit) |
@@ -469,6 +667,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
469 | inst.Start(); | 667 | inst.Start(); |
470 | } | 668 | } |
471 | } | 669 | } |
670 | } | ||
671 | |||
672 | public object DoMaintenance(object p) | ||
673 | { | ||
674 | object[] parms = (object[])p; | ||
675 | int sleepTime = (int)parms[0]; | ||
676 | |||
677 | SaveAllState(); | ||
472 | 678 | ||
473 | System.Threading.Thread.Sleep(sleepTime); | 679 | System.Threading.Thread.Sleep(sleepTime); |
474 | 680 | ||
@@ -478,7 +684,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
478 | return 0; | 684 | return 0; |
479 | } | 685 | } |
480 | 686 | ||
481 | public Type ReplaceableInterface | 687 | public Type ReplaceableInterface |
482 | { | 688 | { |
483 | get { return null; } | 689 | get { return null; } |
484 | } | 690 | } |
@@ -632,7 +838,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
632 | bool postOnRez = (bool)p[4]; | 838 | bool postOnRez = (bool)p[4]; |
633 | StateSource stateSource = (StateSource)p[5]; | 839 | StateSource stateSource = (StateSource)p[5]; |
634 | 840 | ||
635 | lock(m_CompileDict) | 841 | lock (m_CompileDict) |
636 | { | 842 | { |
637 | if (!m_CompileDict.ContainsKey(itemID)) | 843 | if (!m_CompileDict.ContainsKey(itemID)) |
638 | return false; | 844 | return false; |
@@ -648,7 +854,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
648 | SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); | 854 | SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); |
649 | if (part == null) | 855 | if (part == null) |
650 | { | 856 | { |
651 | m_log.Error("[Script] SceneObjectPart unavailable. Script NOT started."); | 857 | m_log.ErrorFormat("[Script]: SceneObjectPart with localID {0} unavailable. Script NOT started.", localID); |
652 | m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n"; | 858 | m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n"; |
653 | m_ScriptFailCount++; | 859 | m_ScriptFailCount++; |
654 | return false; | 860 | return false; |
@@ -769,8 +975,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
769 | } | 975 | } |
770 | } | 976 | } |
771 | 977 | ||
772 | |||
773 | |||
774 | ScriptInstance instance = null; | 978 | ScriptInstance instance = null; |
775 | // Create the object record | 979 | // Create the object record |
776 | lockScriptsForRead(true); | 980 | lockScriptsForRead(true); |
@@ -789,9 +993,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
789 | try | 993 | try |
790 | { | 994 | { |
791 | AppDomainSetup appSetup = new AppDomainSetup(); | 995 | AppDomainSetup appSetup = new AppDomainSetup(); |
792 | // appSetup.ApplicationBase = Path.Combine( | 996 | appSetup.PrivateBinPath = Path.Combine( |
793 | // "ScriptEngines", | 997 | m_ScriptEnginesPath, |
794 | // m_Scene.RegionInfo.RegionID.ToString()); | 998 | m_Scene.RegionInfo.RegionID.ToString()); |
795 | 999 | ||
796 | Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; | 1000 | Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; |
797 | Evidence evidence = new Evidence(baseEvidence); | 1001 | Evidence evidence = new Evidence(baseEvidence); |
@@ -840,8 +1044,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
840 | item.Name, startParam, postOnRez, | 1044 | item.Name, startParam, postOnRez, |
841 | stateSource, m_MaxScriptQueue); | 1045 | stateSource, m_MaxScriptQueue); |
842 | 1046 | ||
843 | m_log.DebugFormat("[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}", | 1047 | m_log.DebugFormat( |
844 | part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID, part.ParentGroup.RootPart.AbsolutePosition.ToString()); | 1048 | "[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}.{5}", |
1049 | part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID, | ||
1050 | part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName); | ||
845 | 1051 | ||
846 | if (presence != null) | 1052 | if (presence != null) |
847 | { | 1053 | { |
@@ -892,9 +1098,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
892 | m_CompileDict.Remove(itemID); | 1098 | m_CompileDict.Remove(itemID); |
893 | } | 1099 | } |
894 | 1100 | ||
895 | lock (m_Scripts) | 1101 | lockScriptsForRead(true); |
1102 | // Do we even have it? | ||
1103 | if (!m_Scripts.ContainsKey(itemID)) | ||
896 | { | 1104 | { |
1105 | // Do we even have it? | ||
1106 | if (!m_Scripts.ContainsKey(itemID)) | ||
1107 | return; | ||
1108 | |||
897 | lockScriptsForRead(false); | 1109 | lockScriptsForRead(false); |
1110 | lockScriptsForWrite(true); | ||
1111 | m_Scripts.Remove(itemID); | ||
1112 | lockScriptsForWrite(false); | ||
1113 | |||
898 | return; | 1114 | return; |
899 | } | 1115 | } |
900 | 1116 | ||
@@ -948,7 +1164,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
948 | 1164 | ||
949 | CleanAssemblies(); | 1165 | CleanAssemblies(); |
950 | 1166 | ||
951 | |||
952 | ScriptRemoved handlerScriptRemoved = OnScriptRemoved; | 1167 | ScriptRemoved handlerScriptRemoved = OnScriptRemoved; |
953 | if (handlerScriptRemoved != null) | 1168 | if (handlerScriptRemoved != null) |
954 | handlerScriptRemoved(itemID); | 1169 | handlerScriptRemoved(itemID); |
@@ -1039,7 +1254,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1039 | startInfo.IdleTimeout = idleTimeout*1000; // convert to seconds as stated in .ini | 1254 | startInfo.IdleTimeout = idleTimeout*1000; // convert to seconds as stated in .ini |
1040 | startInfo.MaxWorkerThreads = maxThreads; | 1255 | startInfo.MaxWorkerThreads = maxThreads; |
1041 | startInfo.MinWorkerThreads = minThreads; | 1256 | startInfo.MinWorkerThreads = minThreads; |
1042 | startInfo.ThreadPriority = threadPriority; | 1257 | startInfo.ThreadPriority = threadPriority;; |
1043 | startInfo.StackSize = stackSize; | 1258 | startInfo.StackSize = stackSize; |
1044 | startInfo.StartSuspended = true; | 1259 | startInfo.StartSuspended = true; |
1045 | 1260 | ||
@@ -1068,7 +1283,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1068 | 1283 | ||
1069 | IScriptInstance instance = (ScriptInstance) parms; | 1284 | IScriptInstance instance = (ScriptInstance) parms; |
1070 | 1285 | ||
1071 | //m_log.DebugFormat("[XENGINE]: Processing event for {0}", instance); | 1286 | //m_log.DebugFormat("[XEngine]: Processing event for {0}", instance); |
1072 | 1287 | ||
1073 | return instance.EventProcessor(); | 1288 | return instance.EventProcessor(); |
1074 | } | 1289 | } |
@@ -1082,26 +1297,34 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1082 | public bool PostObjectEvent(uint localID, EventParams p) | 1297 | public bool PostObjectEvent(uint localID, EventParams p) |
1083 | { | 1298 | { |
1084 | bool result = false; | 1299 | bool result = false; |
1085 | 1300 | List<UUID> uuids = null; | |
1301 | |||
1086 | lock (m_PrimObjects) | 1302 | lock (m_PrimObjects) |
1087 | { | 1303 | { |
1088 | if (!m_PrimObjects.ContainsKey(localID)) | 1304 | if (!m_PrimObjects.ContainsKey(localID)) |
1089 | return false; | 1305 | return false; |
1090 | 1306 | ||
1307 | uuids = m_PrimObjects[localID]; | ||
1091 | 1308 | ||
1092 | foreach (UUID itemID in m_PrimObjects[localID]) | 1309 | |
1310 | foreach (UUID itemID in uuids) | ||
1311 | { | ||
1312 | IScriptInstance instance = null; | ||
1313 | try | ||
1093 | { | 1314 | { |
1094 | if (m_Scripts.ContainsKey(itemID)) | 1315 | if (m_Scripts.ContainsKey(itemID)) |
1095 | { | 1316 | instance = m_Scripts[itemID]; |
1096 | IScriptInstance instance = m_Scripts[itemID]; | ||
1097 | if (instance != null) | ||
1098 | { | ||
1099 | instance.PostEvent(p); | ||
1100 | result = true; | ||
1101 | } | ||
1102 | } | ||
1103 | } | 1317 | } |
1318 | catch { /* ignore race conditions */ } | ||
1319 | |||
1320 | if (instance != null) | ||
1321 | { | ||
1322 | instance.PostEvent(p); | ||
1323 | result = true; | ||
1324 | } | ||
1325 | } | ||
1104 | } | 1326 | } |
1327 | |||
1105 | return result; | 1328 | return result; |
1106 | } | 1329 | } |
1107 | 1330 | ||
@@ -1177,8 +1400,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1177 | if (!(sender is System.AppDomain)) | 1400 | if (!(sender is System.AppDomain)) |
1178 | return null; | 1401 | return null; |
1179 | 1402 | ||
1180 | string[] pathList = new string[] {"bin", "ScriptEngines", | 1403 | string[] pathList = new string[] {"bin", m_ScriptEnginesPath, |
1181 | Path.Combine("ScriptEngines", | 1404 | Path.Combine(m_ScriptEnginesPath, |
1182 | m_Scene.RegionInfo.RegionID.ToString())}; | 1405 | m_Scene.RegionInfo.RegionID.ToString())}; |
1183 | 1406 | ||
1184 | string assemblyName = args.Name; | 1407 | string assemblyName = args.Name; |
@@ -1302,6 +1525,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1302 | 1525 | ||
1303 | public void OnShutdown() | 1526 | public void OnShutdown() |
1304 | { | 1527 | { |
1528 | m_SimulatorShuttingDown = true; | ||
1529 | |||
1305 | List<IScriptInstance> instances = new List<IScriptInstance>(); | 1530 | List<IScriptInstance> instances = new List<IScriptInstance>(); |
1306 | 1531 | ||
1307 | lockScriptsForRead(true); | 1532 | lockScriptsForRead(true); |
@@ -1346,16 +1571,22 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1346 | } | 1571 | } |
1347 | else | 1572 | else |
1348 | { | 1573 | { |
1349 | eq.Enqueue(EventQueueHelper.ScriptRunningReplyEvent(objectID, itemID, GetScriptState(itemID), true), | 1574 | eq.Enqueue(eq.ScriptRunningEvent(objectID, itemID, GetScriptState(itemID), true), |
1350 | controllingClient.AgentId); | 1575 | controllingClient.AgentId); |
1351 | } | 1576 | } |
1352 | } | 1577 | } |
1353 | 1578 | ||
1354 | public string GetXMLState(UUID itemID) | 1579 | public string GetXMLState(UUID itemID) |
1355 | { | 1580 | { |
1581 | // m_log.DebugFormat("[XEngine]: Getting XML state for {0}", itemID); | ||
1582 | |||
1356 | IScriptInstance instance = GetInstance(itemID); | 1583 | IScriptInstance instance = GetInstance(itemID); |
1357 | if (instance == null) | 1584 | if (instance == null) |
1585 | { | ||
1586 | // m_log.DebugFormat("[XEngine]: Found no script for {0}, returning empty string", itemID); | ||
1358 | return ""; | 1587 | return ""; |
1588 | } | ||
1589 | |||
1359 | string xml = instance.GetXMLState(); | 1590 | string xml = instance.GetXMLState(); |
1360 | 1591 | ||
1361 | XmlDocument sdoc = new XmlDocument(); | 1592 | XmlDocument sdoc = new XmlDocument(); |
@@ -1364,7 +1595,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1364 | { | 1595 | { |
1365 | sdoc.LoadXml(xml); | 1596 | sdoc.LoadXml(xml); |
1366 | } | 1597 | } |
1367 | catch (System.Xml.XmlException e) | 1598 | catch (System.Xml.XmlException) |
1368 | { | 1599 | { |
1369 | loadedState = false; | 1600 | loadedState = false; |
1370 | } | 1601 | } |
@@ -1496,6 +1727,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1496 | mapData.InnerText = map; | 1727 | mapData.InnerText = map; |
1497 | 1728 | ||
1498 | stateData.AppendChild(mapData); | 1729 | stateData.AppendChild(mapData); |
1730 | |||
1731 | // m_log.DebugFormat("[XEngine]: Got XML state for {0}", itemID); | ||
1732 | |||
1499 | return doc.InnerXml; | 1733 | return doc.InnerXml; |
1500 | } | 1734 | } |
1501 | 1735 | ||
@@ -1555,7 +1789,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1555 | string fn = assemE.GetAttribute("Filename"); | 1789 | string fn = assemE.GetAttribute("Filename"); |
1556 | string base64 = assemE.InnerText; | 1790 | string base64 = assemE.InnerText; |
1557 | 1791 | ||
1558 | string path = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); | 1792 | string path = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); |
1559 | path = Path.Combine(path, fn); | 1793 | path = Path.Combine(path, fn); |
1560 | 1794 | ||
1561 | if (!File.Exists(path)) | 1795 | if (!File.Exists(path)) |
@@ -1595,7 +1829,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1595 | } | 1829 | } |
1596 | } | 1830 | } |
1597 | 1831 | ||
1598 | string statepath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); | 1832 | string statepath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); |
1599 | statepath = Path.Combine(statepath, itemID.ToString() + ".state"); | 1833 | statepath = Path.Combine(statepath, itemID.ToString() + ".state"); |
1600 | 1834 | ||
1601 | try | 1835 | try |
@@ -1621,7 +1855,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1621 | { | 1855 | { |
1622 | XmlElement mapE = (XmlElement)mapL[0]; | 1856 | XmlElement mapE = (XmlElement)mapL[0]; |
1623 | 1857 | ||
1624 | string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); | 1858 | string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); |
1625 | mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); | 1859 | mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); |
1626 | 1860 | ||
1627 | try | 1861 | try |
@@ -1661,5 +1895,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1661 | return new ArrayList(); | 1895 | return new ArrayList(); |
1662 | } | 1896 | } |
1663 | } | 1897 | } |
1898 | |||
1899 | public void SuspendScript(UUID itemID) | ||
1900 | { | ||
1901 | IScriptInstance instance = GetInstance(itemID); | ||
1902 | if (instance != null) | ||
1903 | instance.Suspend(); | ||
1904 | } | ||
1905 | |||
1906 | public void ResumeScript(UUID itemID) | ||
1907 | { | ||
1908 | IScriptInstance instance = GetInstance(itemID); | ||
1909 | if (instance != null) | ||
1910 | instance.Resume(); | ||
1911 | } | ||
1912 | |||
1913 | public bool HasScript(UUID itemID, out bool running) | ||
1914 | { | ||
1915 | running = true; | ||
1916 | |||
1917 | IScriptInstance instance = GetInstance(itemID); | ||
1918 | if (instance == null) | ||
1919 | return false; | ||
1920 | |||
1921 | running = instance.Running; | ||
1922 | return true; | ||
1923 | } | ||
1664 | } | 1924 | } |
1665 | } | 1925 | } |