diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
6 files changed, 83 insertions, 24 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index d3200d5..f00e41f 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -89,7 +89,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
89 | void Start(); | 89 | void Start(); |
90 | 90 | ||
91 | /// <summary> | 91 | /// <summary> |
92 | /// Stop the script. | 92 | /// Stop the script instance. |
93 | /// </summary> | 93 | /// </summary> |
94 | /// <param name="timeout"></param> | 94 | /// <param name="timeout"></param> |
95 | /// <returns>true if the script was successfully stopped, false otherwise</returns> | 95 | /// <returns>true if the script was successfully stopped, false otherwise</returns> |
@@ -97,13 +97,17 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
97 | 97 | ||
98 | void SetState(string state); | 98 | void SetState(string state); |
99 | 99 | ||
100 | /// <summary> | ||
101 | /// Post an event to this script instance. | ||
102 | /// </summary> | ||
103 | /// <param name="data"></param> | ||
100 | void PostEvent(EventParams data); | 104 | void PostEvent(EventParams data); |
101 | 105 | ||
102 | void Suspend(); | 106 | void Suspend(); |
103 | void Resume(); | 107 | void Resume(); |
104 | 108 | ||
105 | /// <summary> | 109 | /// <summary> |
106 | /// Process the next event queued for this script | 110 | /// Process the next event queued for this script instance. |
107 | /// </summary> | 111 | /// </summary> |
108 | /// <returns></returns> | 112 | /// <returns></returns> |
109 | object EventProcessor(); | 113 | object EventProcessor(); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index ecc5fb5..8dfc7d2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -2102,6 +2102,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2102 | return HomeURI; | 2102 | return HomeURI; |
2103 | } | 2103 | } |
2104 | 2104 | ||
2105 | public string osGetGridGatekeeperURI() | ||
2106 | { | ||
2107 | CheckThreatLevel(ThreatLevel.Moderate, "osGetGridGatekeeperURI"); | ||
2108 | m_host.AddScriptLPS(1); | ||
2109 | |||
2110 | string gatekeeperURI = String.Empty; | ||
2111 | IConfigSource config = m_ScriptEngine.ConfigSource; | ||
2112 | |||
2113 | if (config.Configs["GridService"] != null) | ||
2114 | gatekeeperURI = config.Configs["GridService"].GetString("Gatekeeper", gatekeeperURI); | ||
2115 | |||
2116 | return gatekeeperURI; | ||
2117 | } | ||
2118 | |||
2105 | public string osGetGridCustom(string key) | 2119 | public string osGetGridCustom(string key) |
2106 | { | 2120 | { |
2107 | CheckThreatLevel(ThreatLevel.Moderate, "osGetGridCustom"); | 2121 | CheckThreatLevel(ThreatLevel.Moderate, "osGetGridCustom"); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index fb52600..e59d3a8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -161,6 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
161 | string osGetGridName(); | 161 | string osGetGridName(); |
162 | string osGetGridLoginURI(); | 162 | string osGetGridLoginURI(); |
163 | string osGetGridHomeURI(); | 163 | string osGetGridHomeURI(); |
164 | string osGetGridGatekeeperURI(); | ||
164 | string osGetGridCustom(string key); | 165 | string osGetGridCustom(string key); |
165 | 166 | ||
166 | LSL_String osFormatString(string str, LSL_List strings); | 167 | LSL_String osFormatString(string str, LSL_List strings); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 4341246..e048da2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -457,6 +457,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
457 | return m_OSSL_Functions.osGetGridHomeURI(); | 457 | return m_OSSL_Functions.osGetGridHomeURI(); |
458 | } | 458 | } |
459 | 459 | ||
460 | public string osGetGridGatekeeperURI() | ||
461 | { | ||
462 | return m_OSSL_Functions.osGetGridGatekeeperURI(); | ||
463 | } | ||
464 | |||
460 | public string osGetGridCustom(string key) | 465 | public string osGetGridCustom(string key) |
461 | { | 466 | { |
462 | return m_OSSL_Functions.osGetGridCustom(key); | 467 | return m_OSSL_Functions.osGetGridCustom(key); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index da2ef7b..6d56437 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -59,7 +59,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
59 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 59 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
60 | 60 | ||
61 | private IScriptEngine m_Engine; | 61 | private IScriptEngine m_Engine; |
62 | private IScriptWorkItem m_CurrentResult = null; | 62 | |
63 | /// <summary> | ||
64 | /// The current work item if an event for this script is running or waiting to run, | ||
65 | /// </summary> | ||
66 | /// <remarks> | ||
67 | /// Null if there is no running or waiting to run event. Must be changed only under an m_EventQueue lock. | ||
68 | /// </remarks> | ||
69 | private IScriptWorkItem m_CurrentWorkItem; | ||
70 | |||
63 | private Queue m_EventQueue = new Queue(32); | 71 | private Queue m_EventQueue = new Queue(32); |
64 | private bool m_RunEvents = false; | 72 | private bool m_RunEvents = false; |
65 | private UUID m_ItemID; | 73 | private UUID m_ItemID; |
@@ -158,7 +166,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
158 | { | 166 | { |
159 | // Need to place ourselves back in a work item if there are events to process | 167 | // Need to place ourselves back in a work item if there are events to process |
160 | if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) | 168 | if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) |
161 | m_CurrentResult = m_Engine.QueueEventHandler(this); | 169 | m_CurrentWorkItem = m_Engine.QueueEventHandler(this); |
162 | } | 170 | } |
163 | } | 171 | } |
164 | } | 172 | } |
@@ -528,8 +536,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
528 | 536 | ||
529 | if (m_EventQueue.Count > 0) | 537 | if (m_EventQueue.Count > 0) |
530 | { | 538 | { |
531 | if (m_CurrentResult == null) | 539 | if (m_CurrentWorkItem == null) |
532 | m_CurrentResult = m_Engine.QueueEventHandler(this); | 540 | m_CurrentWorkItem = m_Engine.QueueEventHandler(this); |
533 | // else | 541 | // else |
534 | // m_log.Error("[Script] Tried to start a script that was already queued"); | 542 | // m_log.Error("[Script] Tried to start a script that was already queued"); |
535 | } | 543 | } |
@@ -541,49 +549,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
541 | // m_log.DebugFormat( | 549 | // m_log.DebugFormat( |
542 | // "[SCRIPT INSTANCE]: Stopping script {0} {1} with timeout {2}", ScriptName, ItemID, timeout); | 550 | // "[SCRIPT INSTANCE]: Stopping script {0} {1} with timeout {2}", ScriptName, ItemID, timeout); |
543 | 551 | ||
544 | IScriptWorkItem result; | 552 | IScriptWorkItem workItem; |
545 | 553 | ||
546 | lock (m_EventQueue) | 554 | lock (m_EventQueue) |
547 | { | 555 | { |
548 | if (!Running) | 556 | if (!Running) |
549 | return true; | 557 | return true; |
550 | 558 | ||
551 | if (m_CurrentResult == null) | 559 | // If we're not running or waiting to run an event then we can safely stop. |
560 | if (m_CurrentWorkItem == null) | ||
552 | { | 561 | { |
553 | m_RunEvents = false; | 562 | m_RunEvents = false; |
554 | return true; | 563 | return true; |
555 | } | 564 | } |
556 | 565 | ||
557 | if (m_CurrentResult.Cancel()) | 566 | // If we are waiting to run an event then we can try to cancel it. |
567 | if (m_CurrentWorkItem.Cancel()) | ||
558 | { | 568 | { |
559 | m_CurrentResult = null; | 569 | m_CurrentWorkItem = null; |
560 | m_RunEvents = false; | 570 | m_RunEvents = false; |
561 | return true; | 571 | return true; |
562 | } | 572 | } |
563 | 573 | ||
564 | result = m_CurrentResult; | 574 | workItem = m_CurrentWorkItem; |
565 | m_RunEvents = false; | 575 | m_RunEvents = false; |
566 | } | 576 | } |
567 | 577 | ||
568 | if (result.Wait(new TimeSpan((long)timeout * 100000))) | 578 | // Wait for the current event to complete. |
579 | if (workItem.Wait(new TimeSpan((long)timeout * 100000))) | ||
569 | { | 580 | { |
570 | return true; | 581 | return true; |
571 | } | 582 | } |
572 | 583 | ||
573 | lock (m_EventQueue) | 584 | lock (m_EventQueue) |
574 | { | 585 | { |
575 | result = m_CurrentResult; | 586 | workItem = m_CurrentWorkItem; |
576 | } | 587 | } |
577 | 588 | ||
578 | if (result == null) | 589 | if (workItem == null) |
579 | return true; | 590 | return true; |
580 | 591 | ||
592 | // If the event still hasn't stopped and we the stop isn't the result of script or object removal, then | ||
593 | // forcibly abort the work item (this aborts the underlying thread). | ||
581 | if (!m_InSelfDelete) | 594 | if (!m_InSelfDelete) |
582 | result.Abort(); | 595 | { |
596 | // m_log.ErrorFormat("[SCRIPT INSTANCE]: Aborting script {0} {1}", ScriptName, ItemID); | ||
597 | |||
598 | workItem.Abort(); | ||
599 | } | ||
583 | 600 | ||
584 | lock (m_EventQueue) | 601 | lock (m_EventQueue) |
585 | { | 602 | { |
586 | m_CurrentResult = null; | 603 | m_CurrentWorkItem = null; |
587 | } | 604 | } |
588 | 605 | ||
589 | return true; | 606 | return true; |
@@ -605,6 +622,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
605 | throw new EventAbortException(); | 622 | throw new EventAbortException(); |
606 | } | 623 | } |
607 | 624 | ||
625 | /// <summary> | ||
626 | /// Post an event to this script instance. | ||
627 | /// </summary> | ||
628 | /// <remarks> | ||
629 | /// The request to run the event is sent | ||
630 | /// </remarks> | ||
631 | /// <param name="data"></param> | ||
608 | public void PostEvent(EventParams data) | 632 | public void PostEvent(EventParams data) |
609 | { | 633 | { |
610 | // m_log.DebugFormat("[Script] Posted event {2} in state {3} to {0}.{1}", | 634 | // m_log.DebugFormat("[Script] Posted event {2} in state {3} to {0}.{1}", |
@@ -671,9 +695,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
671 | 695 | ||
672 | m_EventQueue.Enqueue(data); | 696 | m_EventQueue.Enqueue(data); |
673 | 697 | ||
674 | if (m_CurrentResult == null) | 698 | if (m_CurrentWorkItem == null) |
675 | { | 699 | { |
676 | m_CurrentResult = m_Engine.QueueEventHandler(this); | 700 | m_CurrentWorkItem = m_Engine.QueueEventHandler(this); |
677 | } | 701 | } |
678 | } | 702 | } |
679 | } | 703 | } |
@@ -698,11 +722,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
698 | { | 722 | { |
699 | if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) | 723 | if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) |
700 | { | 724 | { |
701 | m_CurrentResult = m_Engine.QueueEventHandler(this); | 725 | if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) |
726 | { | ||
727 | m_CurrentWorkItem = m_Engine.QueueEventHandler(this); | ||
728 | } | ||
729 | else | ||
730 | { | ||
731 | m_CurrentWorkItem = null; | ||
732 | } | ||
733 | return 0; | ||
702 | } | 734 | } |
703 | else | 735 | else |
704 | { | 736 | { |
705 | m_CurrentResult = null; | 737 | m_CurrentWorkItem = null; |
706 | } | 738 | } |
707 | return 0; | 739 | return 0; |
708 | } | 740 | } |
@@ -825,15 +857,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
825 | } | 857 | } |
826 | } | 858 | } |
827 | 859 | ||
860 | |||
861 | // If there are more events and we are currently running and not shutting down, then ask the | ||
862 | // script engine to run the next event. | ||
828 | lock (m_EventQueue) | 863 | lock (m_EventQueue) |
829 | { | 864 | { |
830 | if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) | 865 | if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) |
831 | { | 866 | { |
832 | m_CurrentResult = m_Engine.QueueEventHandler(this); | 867 | m_CurrentWorkItem = m_Engine.QueueEventHandler(this); |
833 | } | 868 | } |
834 | else | 869 | else |
835 | { | 870 | { |
836 | m_CurrentResult = null; | 871 | m_CurrentWorkItem = null; |
837 | } | 872 | } |
838 | } | 873 | } |
839 | 874 | ||
@@ -941,8 +976,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
941 | 976 | ||
942 | public void SaveState(string assembly) | 977 | public void SaveState(string assembly) |
943 | { | 978 | { |
944 | |||
945 | |||
946 | // If we're currently in an event, just tell it to save upon return | 979 | // If we're currently in an event, just tell it to save upon return |
947 | // | 980 | // |
948 | if (m_InEvent) | 981 | if (m_InEvent) |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index db6a407..1d3ba6c 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -452,6 +452,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
452 | 452 | ||
453 | sb.AppendFormat("Unique scripts : {0}\n", m_uniqueScripts.Count); | 453 | sb.AppendFormat("Unique scripts : {0}\n", m_uniqueScripts.Count); |
454 | sb.AppendFormat("Scripts waiting for load : {0}\n", m_CompileQueue.Count); | 454 | sb.AppendFormat("Scripts waiting for load : {0}\n", m_CompileQueue.Count); |
455 | sb.AppendFormat("Max threads : {0}\n", m_ThreadPool.MaxThreads); | ||
456 | sb.AppendFormat("Min threads : {0}\n", m_ThreadPool.MinThreads); | ||
455 | sb.AppendFormat("Allocated threads : {0}\n", m_ThreadPool.ActiveThreads); | 457 | sb.AppendFormat("Allocated threads : {0}\n", m_ThreadPool.ActiveThreads); |
456 | sb.AppendFormat("In use threads : {0}\n", m_ThreadPool.InUseThreads); | 458 | sb.AppendFormat("In use threads : {0}\n", m_ThreadPool.InUseThreads); |
457 | sb.AppendFormat("Work items waiting : {0}\n", m_ThreadPool.WaitingCallbacks); | 459 | sb.AppendFormat("Work items waiting : {0}\n", m_ThreadPool.WaitingCallbacks); |