aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs26
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs26
2 files changed, 35 insertions, 17 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 4906665..4a4d98f 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -98,9 +98,10 @@ namespace OpenSim.Region.Framework.Scenes
98 98
99 public event OnPluginConsoleDelegate OnPluginConsole; 99 public event OnPluginConsoleDelegate OnPluginConsole;
100 100
101 public delegate void OnShutdownDelegate(); 101 /// <summary>
102 102 /// Triggered when the entire simulator is shutdown.
103 public event OnShutdownDelegate OnShutdown; 103 /// </summary>
104 public event Action OnShutdown;
104 105
105 public delegate void ObjectDeGrabDelegate(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs); 106 public delegate void ObjectDeGrabDelegate(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs);
106 public delegate void ScriptResetDelegate(uint localID, UUID itemID); 107 public delegate void ScriptResetDelegate(uint localID, UUID itemID);
@@ -113,9 +114,14 @@ namespace OpenSim.Region.Framework.Scenes
113 114
114 public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest; 115 public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
115 116
116 public delegate void SceneShuttingDownDelegate(Scene scene); 117 /// <summary>
117 118 /// Triggered when an individual scene is shutdown.
118 public event SceneShuttingDownDelegate OnSceneShuttingDown; 119 /// </summary>
120 /// <remarks>
121 /// This does not automatically mean that the entire simulator is shutting down. Listen to OnShutdown for that
122 /// notification.
123 /// </remarks>
124 public event Action<Scene> OnSceneShuttingDown;
119 125
120 /// <summary> 126 /// <summary>
121 /// Fired when an object is touched/grabbed. 127 /// Fired when an object is touched/grabbed.
@@ -869,10 +875,10 @@ namespace OpenSim.Region.Framework.Scenes
869 875
870 public void TriggerShutdown() 876 public void TriggerShutdown()
871 { 877 {
872 OnShutdownDelegate handlerShutdown = OnShutdown; 878 Action handlerShutdown = OnShutdown;
873 if (handlerShutdown != null) 879 if (handlerShutdown != null)
874 { 880 {
875 foreach (OnShutdownDelegate d in handlerShutdown.GetInvocationList()) 881 foreach (Action d in handlerShutdown.GetInvocationList())
876 { 882 {
877 try 883 try
878 { 884 {
@@ -2212,10 +2218,10 @@ namespace OpenSim.Region.Framework.Scenes
2212 2218
2213 public void TriggerSceneShuttingDown(Scene s) 2219 public void TriggerSceneShuttingDown(Scene s)
2214 { 2220 {
2215 SceneShuttingDownDelegate handler = OnSceneShuttingDown; 2221 Action<Scene> handler = OnSceneShuttingDown;
2216 if (handler != null) 2222 if (handler != null)
2217 { 2223 {
2218 foreach (SceneShuttingDownDelegate d in handler.GetInvocationList()) 2224 foreach (Action<Scene> d in handler.GetInvocationList())
2219 { 2225 {
2220 try 2226 try
2221 { 2227 {
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 1c16c87..12e1a78 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -90,6 +90,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
90 private bool m_KillTimedOutScripts; 90 private bool m_KillTimedOutScripts;
91 private string m_ScriptEnginesPath = null; 91 private string m_ScriptEnginesPath = null;
92 92
93 /// <summary>
94 /// Is the entire simulator in the process of shutting down?
95 /// </summary>
96 private bool m_SimulatorShuttingDown;
97
93 private static List<XEngine> m_ScriptEngines = 98 private static List<XEngine> m_ScriptEngines =
94 new List<XEngine>(); 99 new List<XEngine>();
95 100
@@ -470,17 +475,22 @@ namespace OpenSim.Region.ScriptEngine.XEngine
470 // 475 //
471 instance.DestroyScriptInstance(); 476 instance.DestroyScriptInstance();
472 477
473 // Unload scripts and app domains 478 // Unload scripts and app domains.
474 // Must be done explicitly because they have infinite 479 // Must be done explicitly because they have infinite
475 // lifetime 480 // lifetime.
476 // 481 // However, don't bother to do this if the simulator is shutting
477 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); 482 // down since it takes a long time with many scripts.
478 if (m_DomainScripts[instance.AppDomain].Count == 0) 483 if (!m_SimulatorShuttingDown)
479 { 484 {
480 m_DomainScripts.Remove(instance.AppDomain); 485 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID);
481 UnloadAppDomain(instance.AppDomain); 486 if (m_DomainScripts[instance.AppDomain].Count == 0)
487 {
488 m_DomainScripts.Remove(instance.AppDomain);
489 UnloadAppDomain(instance.AppDomain);
490 }
482 } 491 }
483 } 492 }
493
484 m_Scripts.Clear(); 494 m_Scripts.Clear();
485 m_PrimObjects.Clear(); 495 m_PrimObjects.Clear();
486 m_Assemblies.Clear(); 496 m_Assemblies.Clear();
@@ -1428,6 +1438,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1428 1438
1429 public void OnShutdown() 1439 public void OnShutdown()
1430 { 1440 {
1441 m_SimulatorShuttingDown = true;
1442
1431 List<IScriptInstance> instances = new List<IScriptInstance>(); 1443 List<IScriptInstance> instances = new List<IScriptInstance>();
1432 1444
1433 lock (m_Scripts) 1445 lock (m_Scripts)