diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 4ba206e75e..9f05cf4fb4 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -682,12 +682,20 @@ namespace OpenSim if (!SceneManager.TrySetCurrentScene(newRegionName)) MainConsole.Instance.Output(String.Format("Couldn't select region {0}", newRegionName)); + else + RefreshPrompt(); } else { MainConsole.Instance.Output("Usage: change region "); } + } + /// + /// Refreshs prompt with the current selection details. + /// + private void RefreshPrompt() + { string regionName = (SceneManager.CurrentScene == null ? "root" : SceneManager.CurrentScene.RegionInfo.RegionName); MainConsole.Instance.Output(String.Format("Currently selected region is {0}", regionName)); @@ -709,6 +717,18 @@ namespace OpenSim m_console.ConsoleScene = SceneManager.CurrentScene; } + protected override void HandleRestartRegion(RegionInfo whichRegion) + { + base.HandleRestartRegion(whichRegion); + + // Where we are restarting multiple scenes at once, a previous call to RefreshPrompt may have set the + // m_console.ConsoleScene to null (indicating all scenes). + if (m_console.ConsoleScene != null && whichRegion.RegionName == ((Scene)m_console.ConsoleScene).Name) + SceneManager.TrySetCurrentScene(whichRegion.RegionName); + + RefreshPrompt(); + } + /// /// Turn on some debugging values for OpenSim. /// diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 917f109a00..2927f1fccf 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -310,7 +310,7 @@ namespace OpenSim // Called from base.StartUp() m_httpServerPort = m_networkServersInfo.HttpListenerPort; - SceneManager.OnRestartSim += handleRestartRegion; + SceneManager.OnRestartSim += HandleRestartRegion; // Only enable the watchdogs when all regions are ready. Otherwise we get false positives when cpu is // heavily used during initial startup. @@ -759,9 +759,11 @@ namespace OpenSim } } - public void handleRestartRegion(RegionInfo whichRegion) + protected virtual void HandleRestartRegion(RegionInfo whichRegion) { - m_log.Info("[OPENSIM]: Got restart signal from SceneManager"); + m_log.InfoFormat( + "[OPENSIM]: Got restart signal from SceneManager for region {0} ({1},{2})", + whichRegion.RegionName, whichRegion.RegionLocX, whichRegion.RegionLocY); ShutdownClientServer(whichRegion); IScene scene; @@ -907,7 +909,6 @@ namespace OpenSim m_log.Info("[SHUTDOWN]: Closing all threads"); m_log.Info("[SHUTDOWN]: Killing listener thread"); m_log.Info("[SHUTDOWN]: Killing clients"); - // TODO: implement this m_log.Info("[SHUTDOWN]: Closing console and terminating"); try @@ -916,7 +917,7 @@ namespace OpenSim } catch (Exception e) { - m_log.ErrorFormat("[SHUTDOWN]: Ignoring failure during shutdown - {0}", e); + m_log.Error("[SHUTDOWN]: Ignoring failure during shutdown - ", e); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b893a6facc..d11e9ab783 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1097,16 +1097,10 @@ namespace OpenSim.Region.Framework.Scenes } } - m_log.Error("[REGION]: Closing"); + m_log.InfoFormat("[REGION]: Restarting region {0}", Name); + Close(); - if (PhysicsScene != null) - { - PhysicsScene.Dispose(); - } - - m_log.Error("[REGION]: Firing Region Restart Message"); - base.Restart(); } diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index c81b55de16..b4924ef6f7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs @@ -96,23 +96,25 @@ namespace OpenSim.Region.Framework.Scenes } private readonly List m_localScenes = new List(); - private Scene m_currentScene = null; public List Scenes { get { return new List(m_localScenes); } } - public Scene CurrentScene - { - get { return m_currentScene; } - } + /// + /// Scene selected from the console. + /// + /// + /// If null, then all scenes are considered selected (signalled as "Root" on the console). + /// + public Scene CurrentScene { get; private set; } public Scene CurrentOrFirstScene { get { - if (m_currentScene == null) + if (CurrentScene == null) { lock (m_localScenes) { @@ -124,7 +126,7 @@ namespace OpenSim.Region.Framework.Scenes } else { - return m_currentScene; + return CurrentScene; } } } @@ -192,8 +194,7 @@ namespace OpenSim.Region.Framework.Scenes public void HandleRestart(RegionInfo rdata) { - m_log.Error("[SCENEMANAGER]: Got Restart message for region:" + rdata.RegionName + " Sending up to main"); - int RegionSceneElement = -1; + Scene restartedScene = null; lock (m_localScenes) { @@ -201,19 +202,18 @@ namespace OpenSim.Region.Framework.Scenes { if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName) { - RegionSceneElement = i; + restartedScene = m_localScenes[i]; + m_localScenes.RemoveAt(i); + break; } } - - // Now we make sure the region is no longer known about by the SceneManager - // Prevents duplicates. - - if (RegionSceneElement >= 0) - { - m_localScenes.RemoveAt(RegionSceneElement); - } } + // If the currently selected scene has been restarted, then we can't reselect here since we the scene + // hasn't yet been recreated. We will have to leave this to the caller. + if (CurrentScene == restartedScene) + CurrentScene = null; + // Send signal to main that we're restarting this sim. OnRestartSim(rdata); } @@ -355,14 +355,14 @@ namespace OpenSim.Region.Framework.Scenes private void ForEachCurrentScene(Action func) { - if (m_currentScene == null) + if (CurrentScene == null) { lock (m_localScenes) m_localScenes.ForEach(func); } else { - func(m_currentScene); + func(CurrentScene); } } @@ -382,7 +382,7 @@ namespace OpenSim.Region.Framework.Scenes || (String.Compare(regionName, "..") == 0) || (String.Compare(regionName, "/") == 0)) { - m_currentScene = null; + CurrentScene = null; return true; } else @@ -393,7 +393,7 @@ namespace OpenSim.Region.Framework.Scenes { if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0) { - m_currentScene = scene; + CurrentScene = scene; return true; } } @@ -413,7 +413,7 @@ namespace OpenSim.Region.Framework.Scenes { if (scene.RegionInfo.RegionID == regionID) { - m_currentScene = scene; + CurrentScene = scene; return true; } }