Xengine patch to force a persistence save on script creation. This prevents

duplicate delivery of state_entry if a region is restarted just after
saving the script. Changes script state saves to no longer abort long-
running event handlers. Queues the save instead. Adds shutdown handler
to save script state on irderly shutdown
This commit is contained in:
Melanie Thielker
2008-09-07 22:01:25 +00:00
parent e3338bac20
commit 669f553400
3 changed files with 52 additions and 9 deletions

View File

@@ -210,6 +210,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_Scene.EventManager.OnScriptReset += OnScriptReset;
m_Scene.EventManager.OnStartScript += OnStartScript;
m_Scene.EventManager.OnStopScript += OnStopScript;
m_Scene.EventManager.OnShutdown += OnShutdown;
m_AsyncCommands = new AsyncCommandManager(this);
@@ -247,7 +248,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
Object[] p = (Object[])o;
int saveTime = (int)p[0];
System.Threading.Thread.Sleep(saveTime);
if (saveTime > 0)
System.Threading.Thread.Sleep(saveTime);
// m_log.Debug("[XEngine] Backing up script states");
@@ -275,8 +277,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
instances.Clear();
m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup),
new Object[] { saveTime });
if (saveTime > 0)
m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup),
new Object[] { saveTime });
return 0;
}
@@ -840,5 +843,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{
return GetScriptState(itemID);
}
public void OnShutdown()
{
List<IScriptInstance> instances = new List<IScriptInstance>();
lock (m_Scripts)
{
foreach (IScriptInstance instance in m_Scripts.Values)
instances.Add(instance);
}
foreach (IScriptInstance i in instances)
{
i.Stop(50);
}
DoBackup(new Object[] {0});
}
}
}