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)