diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 4906665cbe..4a4d98fa74 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -98,9 +98,10 @@ namespace OpenSim.Region.Framework.Scenes public event OnPluginConsoleDelegate OnPluginConsole; - public delegate void OnShutdownDelegate(); - - public event OnShutdownDelegate OnShutdown; + /// + /// Triggered when the entire simulator is shutdown. + /// + public event Action OnShutdown; public delegate void ObjectDeGrabDelegate(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs); public delegate void ScriptResetDelegate(uint localID, UUID itemID); @@ -113,9 +114,14 @@ namespace OpenSim.Region.Framework.Scenes public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest; - public delegate void SceneShuttingDownDelegate(Scene scene); - - public event SceneShuttingDownDelegate OnSceneShuttingDown; + /// + /// Triggered when an individual scene is shutdown. + /// + /// + /// This does not automatically mean that the entire simulator is shutting down. Listen to OnShutdown for that + /// notification. + /// + public event Action OnSceneShuttingDown; /// /// Fired when an object is touched/grabbed. @@ -869,10 +875,10 @@ namespace OpenSim.Region.Framework.Scenes public void TriggerShutdown() { - OnShutdownDelegate handlerShutdown = OnShutdown; + Action handlerShutdown = OnShutdown; if (handlerShutdown != null) { - foreach (OnShutdownDelegate d in handlerShutdown.GetInvocationList()) + foreach (Action d in handlerShutdown.GetInvocationList()) { try { @@ -2212,10 +2218,10 @@ namespace OpenSim.Region.Framework.Scenes public void TriggerSceneShuttingDown(Scene s) { - SceneShuttingDownDelegate handler = OnSceneShuttingDown; + Action handler = OnSceneShuttingDown; if (handler != null) { - foreach (SceneShuttingDownDelegate d in handler.GetInvocationList()) + foreach (Action d in handler.GetInvocationList()) { try { diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 1c16c8736f..12e1a78871 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -90,6 +90,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine private bool m_KillTimedOutScripts; private string m_ScriptEnginesPath = null; + /// + /// Is the entire simulator in the process of shutting down? + /// + private bool m_SimulatorShuttingDown; + private static List m_ScriptEngines = new List(); @@ -470,17 +475,22 @@ namespace OpenSim.Region.ScriptEngine.XEngine // instance.DestroyScriptInstance(); - // Unload scripts and app domains + // Unload scripts and app domains. // Must be done explicitly because they have infinite - // lifetime - // - m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); - if (m_DomainScripts[instance.AppDomain].Count == 0) + // lifetime. + // However, don't bother to do this if the simulator is shutting + // down since it takes a long time with many scripts. + if (!m_SimulatorShuttingDown) { - m_DomainScripts.Remove(instance.AppDomain); - UnloadAppDomain(instance.AppDomain); + m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); + if (m_DomainScripts[instance.AppDomain].Count == 0) + { + m_DomainScripts.Remove(instance.AppDomain); + UnloadAppDomain(instance.AppDomain); + } } } + m_Scripts.Clear(); m_PrimObjects.Clear(); m_Assemblies.Clear(); @@ -1428,6 +1438,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine public void OnShutdown() { + m_SimulatorShuttingDown = true; + List instances = new List(); lock (m_Scripts)