aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorOren Hurvitz2015-08-07 16:35:32 +0300
committerOren Hurvitz2015-08-11 08:44:27 +0100
commit59da146e9dd678aea2e0bd3e16ef178c183754a0 (patch)
tree4b6cfebfd3d0a41cc51dcd2eac377ce9cfbe8d2c /OpenSim
parentWhen scripts are sleeping, don't count that as execution time (diff)
downloadopensim-SC_OLD-59da146e9dd678aea2e0bd3e16ef178c183754a0.zip
opensim-SC_OLD-59da146e9dd678aea2e0bd3e16ef178c183754a0.tar.gz
opensim-SC_OLD-59da146e9dd678aea2e0bd3e16ef178c183754a0.tar.bz2
opensim-SC_OLD-59da146e9dd678aea2e0bd3e16ef178c183754a0.tar.xz
When the user stops a script, have it remain stopped
Previously the script state was never saved for a !Running script, so upon region restart the script would be Running again. The use of the 'StayStopped' flag is needed because all scripts are automatically stopped when the region shuts down, but in that case we shouldn't save in their state that they're !Running.
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs21
-rwxr-xr-xOpenSim/Region/ScriptEngine/XEngine/XEngine.cs5
3 files changed, 28 insertions, 3 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index f695eba..16641f7 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -93,6 +93,11 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
93 bool ShuttingDown { get; set; } 93 bool ShuttingDown { get; set; }
94 94
95 /// <summary> 95 /// <summary>
96 /// When stopping the script: should it remain stopped permanently (i.e., save !Running in its state)?
97 /// </summary>
98 bool StayStopped { get; set; }
99
100 /// <summary>
96 /// Script state 101 /// Script state
97 /// </summary> 102 /// </summary>
98 string State { get; set; } 103 string State { get; set; }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index c6512ba..6541256 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
126 } 126 }
127 } 127 }
128 128
129 public bool Running { get; set; } 129 public bool Running
130 {
131 get { return m_running; }
132
133 set
134 {
135 m_running = value;
136 if (m_running)
137 StayStopped = false;
138 }
139 }
140 private bool m_running;
130 141
131 public bool Suspended 142 public bool Suspended
132 { 143 {
@@ -158,6 +169,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
158 169
159 public string State { get; set; } 170 public string State { get; set; }
160 171
172 public bool StayStopped { get; set; }
173
161 public IScriptEngine Engine { get; private set; } 174 public IScriptEngine Engine { get; private set; }
162 175
163 public UUID AppDomain { get; set; } 176 public UUID AppDomain { get; set; }
@@ -1077,7 +1090,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1077 1090
1078 public void SaveState() 1091 public void SaveState()
1079 { 1092 {
1080 if (!Running) 1093 if (!Running && !StayStopped)
1081 return; 1094 return;
1082 1095
1083 // We cannot call this inside the EventQueue lock since it will currently take AsyncCommandManager.staticLock. 1096 // 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
1089 lock (EventQueue) 1102 lock (EventQueue)
1090 { 1103 {
1091 // Check again to avoid a race with a thread in Stop() 1104 // Check again to avoid a race with a thread in Stop()
1092 if (!Running) 1105 if (!Running && !StayStopped)
1093 return; 1106 return;
1094 1107
1095 // If we're currently in an event, just tell it to save upon return 1108 // If we're currently in an event, just tell it to save upon return
@@ -1130,6 +1143,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1130 //} 1143 //}
1131 m_CurrentStateHash = hash; 1144 m_CurrentStateHash = hash;
1132 } 1145 }
1146
1147 StayStopped = false;
1133 } 1148 }
1134 } 1149 }
1135 1150
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 5071884..62bf803 100755
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -699,6 +699,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
699 { 699 {
700 if (instance.Running) 700 if (instance.Running)
701 { 701 {
702 instance.StayStopped = true; // the script was stopped explicitly
703
702 instance.Stop(0); 704 instance.Stop(0);
703 705
704 SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); 706 SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID);
@@ -1914,6 +1916,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1914 1916
1915 if (instance != null) 1917 if (instance != null)
1916 { 1918 {
1919 lock (instance.EventQueue)
1920 instance.StayStopped = true; // the script was stopped explicitly
1921
1917 instance.Stop(m_WaitForEventCompletionOnScriptStop); 1922 instance.Stop(m_WaitForEventCompletionOnScriptStop);
1918 } 1923 }
1919 else 1924 else