diff options
3 files changed, 33 insertions, 4 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index 00a99c3..2f5b526 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -147,7 +147,13 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
147 | /// <summary> | 147 | /// <summary> |
148 | /// Stop the script instance. | 148 | /// Stop the script instance. |
149 | /// </summary> | 149 | /// </summary> |
150 | /// <remarks> | ||
151 | /// This must not be called by a thread that is in the process of handling an event for this script. Otherwise | ||
152 | /// there is a danger that it will self-abort and not complete the reset. | ||
153 | /// </remarks> | ||
150 | /// <param name="timeout"></param> | 154 | /// <param name="timeout"></param> |
155 | /// How many milliseconds we will wait for an existing script event to finish before | ||
156 | /// forcibly aborting that event. | ||
151 | /// <returns>true if the script was successfully stopped, false otherwise</returns> | 157 | /// <returns>true if the script was successfully stopped, false otherwise</returns> |
152 | bool Stop(int timeout); | 158 | bool Stop(int timeout); |
153 | 159 | ||
@@ -169,8 +175,31 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
169 | object EventProcessor(); | 175 | object EventProcessor(); |
170 | 176 | ||
171 | int EventTime(); | 177 | int EventTime(); |
172 | void ResetScript(); | 178 | |
179 | /// <summary> | ||
180 | /// Reset the script. | ||
181 | /// </summary> | ||
182 | /// <remarks> | ||
183 | /// This must not be called by a thread that is in the process of handling an event for this script. Otherwise | ||
184 | /// there is a danger that it will self-abort and not complete the reset. Such a thread must call | ||
185 | /// ApiResetScript() instead. | ||
186 | /// </remarks> | ||
187 | /// <param name='timeout'> | ||
188 | /// How many milliseconds we will wait for an existing script event to finish before | ||
189 | /// forcibly aborting that event prior to script reset. | ||
190 | /// </param> | ||
191 | void ResetScript(int timeout); | ||
192 | |||
193 | /// <summary> | ||
194 | /// Reset the script. | ||
195 | /// </summary> | ||
196 | /// <remarks> | ||
197 | /// This must not be called by any thread other than the one executing the scripts current event. This is | ||
198 | /// because there is no wait or abort logic if another thread is in the middle of processing a script event. | ||
199 | /// Such an external thread should use ResetScript() instead. | ||
200 | /// </remarks> | ||
173 | void ApiResetScript(); | 201 | void ApiResetScript(); |
202 | |||
174 | Dictionary<string, object> GetVars(); | 203 | Dictionary<string, object> GetVars(); |
175 | void SetVars(Dictionary<string, object> vars); | 204 | void SetVars(Dictionary<string, object> vars); |
176 | DetectParams GetDetectParams(int idx); | 205 | DetectParams GetDetectParams(int idx); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index dfe8386..01a5e34 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -877,7 +877,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
877 | return (DateTime.Now - m_EventStart).Seconds; | 877 | return (DateTime.Now - m_EventStart).Seconds; |
878 | } | 878 | } |
879 | 879 | ||
880 | public void ResetScript() | 880 | public void ResetScript(int timeout) |
881 | { | 881 | { |
882 | if (m_Script == null) | 882 | if (m_Script == null) |
883 | return; | 883 | return; |
@@ -887,7 +887,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
887 | RemoveState(); | 887 | RemoveState(); |
888 | ReleaseControls(); | 888 | ReleaseControls(); |
889 | 889 | ||
890 | Stop(0); | 890 | Stop(timeout); |
891 | SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); | 891 | SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); |
892 | part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; | 892 | part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; |
893 | part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; | 893 | part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 1dd50c7..f38d17d 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -1691,7 +1691,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1691 | { | 1691 | { |
1692 | IScriptInstance instance = GetInstance(itemID); | 1692 | IScriptInstance instance = GetInstance(itemID); |
1693 | if (instance != null) | 1693 | if (instance != null) |
1694 | instance.ResetScript(); | 1694 | instance.ResetScript(m_WaitForEventCompletionOnScriptStop); |
1695 | } | 1695 | } |
1696 | 1696 | ||
1697 | public void StartScript(UUID itemID) | 1697 | public void StartScript(UUID itemID) |