diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index f695eba8a7..16641f790a 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -92,6 +92,11 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
///
bool ShuttingDown { get; set; }
+ ///
+ /// When stopping the script: should it remain stopped permanently (i.e., save !Running in its state)?
+ ///
+ bool StayStopped { get; set; }
+
///
/// Script state
///
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index c6512ba865..654125662b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -126,7 +126,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
}
- public bool Running { get; set; }
+ public bool Running
+ {
+ get { return m_running; }
+
+ set
+ {
+ m_running = value;
+ if (m_running)
+ StayStopped = false;
+ }
+ }
+ private bool m_running;
public bool Suspended
{
@@ -158,6 +169,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public string State { get; set; }
+ public bool StayStopped { get; set; }
+
public IScriptEngine Engine { get; private set; }
public UUID AppDomain { get; set; }
@@ -1077,7 +1090,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void SaveState()
{
- if (!Running)
+ if (!Running && !StayStopped)
return;
// We cannot call this inside the EventQueue lock since it will currently take AsyncCommandManager.staticLock.
@@ -1089,7 +1102,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
lock (EventQueue)
{
// Check again to avoid a race with a thread in Stop()
- if (!Running)
+ if (!Running && !StayStopped)
return;
// If we're currently in an event, just tell it to save upon return
@@ -1130,6 +1143,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
//}
m_CurrentStateHash = hash;
}
+
+ StayStopped = false;
}
}
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 5071884ed0..62bf803048 100755
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -699,6 +699,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{
if (instance.Running)
{
+ instance.StayStopped = true; // the script was stopped explicitly
+
instance.Stop(0);
SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
@@ -1914,6 +1916,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (instance != null)
{
+ lock (instance.EventQueue)
+ instance.StayStopped = true; // the script was stopped explicitly
+
instance.Stop(m_WaitForEventCompletionOnScriptStop);
}
else