Fix problem where restarting the currently selected region would stop various console commands (e.g. "show users") from working.
This was because the "currently selected" scene reference was being left as the dead scene instead of the restarted Scene object.0.7.4-extended
parent
e18d6c0956
commit
7c811c39c8
|
@ -682,12 +682,20 @@ namespace OpenSim
|
||||||
|
|
||||||
if (!SceneManager.TrySetCurrentScene(newRegionName))
|
if (!SceneManager.TrySetCurrentScene(newRegionName))
|
||||||
MainConsole.Instance.Output(String.Format("Couldn't select region {0}", newRegionName));
|
MainConsole.Instance.Output(String.Format("Couldn't select region {0}", newRegionName));
|
||||||
|
else
|
||||||
|
RefreshPrompt();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MainConsole.Instance.Output("Usage: change region <region name>");
|
MainConsole.Instance.Output("Usage: change region <region name>");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Refreshs prompt with the current selection details.
|
||||||
|
/// </summary>
|
||||||
|
private void RefreshPrompt()
|
||||||
|
{
|
||||||
string regionName = (SceneManager.CurrentScene == null ? "root" : SceneManager.CurrentScene.RegionInfo.RegionName);
|
string regionName = (SceneManager.CurrentScene == null ? "root" : SceneManager.CurrentScene.RegionInfo.RegionName);
|
||||||
MainConsole.Instance.Output(String.Format("Currently selected region is {0}", regionName));
|
MainConsole.Instance.Output(String.Format("Currently selected region is {0}", regionName));
|
||||||
|
|
||||||
|
@ -709,6 +717,18 @@ namespace OpenSim
|
||||||
m_console.ConsoleScene = SceneManager.CurrentScene;
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Turn on some debugging values for OpenSim.
|
/// Turn on some debugging values for OpenSim.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -310,7 +310,7 @@ namespace OpenSim
|
||||||
// Called from base.StartUp()
|
// Called from base.StartUp()
|
||||||
|
|
||||||
m_httpServerPort = m_networkServersInfo.HttpListenerPort;
|
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
|
// Only enable the watchdogs when all regions are ready. Otherwise we get false positives when cpu is
|
||||||
// heavily used during initial startup.
|
// 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);
|
ShutdownClientServer(whichRegion);
|
||||||
IScene scene;
|
IScene scene;
|
||||||
|
@ -907,7 +909,6 @@ namespace OpenSim
|
||||||
m_log.Info("[SHUTDOWN]: Closing all threads");
|
m_log.Info("[SHUTDOWN]: Closing all threads");
|
||||||
m_log.Info("[SHUTDOWN]: Killing listener thread");
|
m_log.Info("[SHUTDOWN]: Killing listener thread");
|
||||||
m_log.Info("[SHUTDOWN]: Killing clients");
|
m_log.Info("[SHUTDOWN]: Killing clients");
|
||||||
// TODO: implement this
|
|
||||||
m_log.Info("[SHUTDOWN]: Closing console and terminating");
|
m_log.Info("[SHUTDOWN]: Closing console and terminating");
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -916,7 +917,7 @@ namespace OpenSim
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[SHUTDOWN]: Ignoring failure during shutdown - {0}", e);
|
m_log.Error("[SHUTDOWN]: Ignoring failure during shutdown - ", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1097,16 +1097,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.Error("[REGION]: Closing");
|
m_log.InfoFormat("[REGION]: Restarting region {0}", Name);
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
|
|
||||||
if (PhysicsScene != null)
|
|
||||||
{
|
|
||||||
PhysicsScene.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_log.Error("[REGION]: Firing Region Restart Message");
|
|
||||||
|
|
||||||
base.Restart();
|
base.Restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,23 +96,25 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<Scene> m_localScenes = new List<Scene>();
|
private readonly List<Scene> m_localScenes = new List<Scene>();
|
||||||
private Scene m_currentScene = null;
|
|
||||||
|
|
||||||
public List<Scene> Scenes
|
public List<Scene> Scenes
|
||||||
{
|
{
|
||||||
get { return new List<Scene>(m_localScenes); }
|
get { return new List<Scene>(m_localScenes); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Scene CurrentScene
|
/// <summary>
|
||||||
{
|
/// Scene selected from the console.
|
||||||
get { return m_currentScene; }
|
/// </summary>
|
||||||
}
|
/// <value>
|
||||||
|
/// If null, then all scenes are considered selected (signalled as "Root" on the console).
|
||||||
|
/// </value>
|
||||||
|
public Scene CurrentScene { get; private set; }
|
||||||
|
|
||||||
public Scene CurrentOrFirstScene
|
public Scene CurrentOrFirstScene
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (m_currentScene == null)
|
if (CurrentScene == null)
|
||||||
{
|
{
|
||||||
lock (m_localScenes)
|
lock (m_localScenes)
|
||||||
{
|
{
|
||||||
|
@ -124,7 +126,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return m_currentScene;
|
return CurrentScene;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,8 +194,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public void HandleRestart(RegionInfo rdata)
|
public void HandleRestart(RegionInfo rdata)
|
||||||
{
|
{
|
||||||
m_log.Error("[SCENEMANAGER]: Got Restart message for region:" + rdata.RegionName + " Sending up to main");
|
Scene restartedScene = null;
|
||||||
int RegionSceneElement = -1;
|
|
||||||
|
|
||||||
lock (m_localScenes)
|
lock (m_localScenes)
|
||||||
{
|
{
|
||||||
|
@ -201,18 +202,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName)
|
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
|
// If the currently selected scene has been restarted, then we can't reselect here since we the scene
|
||||||
// Prevents duplicates.
|
// hasn't yet been recreated. We will have to leave this to the caller.
|
||||||
|
if (CurrentScene == restartedScene)
|
||||||
if (RegionSceneElement >= 0)
|
CurrentScene = null;
|
||||||
{
|
|
||||||
m_localScenes.RemoveAt(RegionSceneElement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send signal to main that we're restarting this sim.
|
// Send signal to main that we're restarting this sim.
|
||||||
OnRestartSim(rdata);
|
OnRestartSim(rdata);
|
||||||
|
@ -355,14 +355,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
private void ForEachCurrentScene(Action<Scene> func)
|
private void ForEachCurrentScene(Action<Scene> func)
|
||||||
{
|
{
|
||||||
if (m_currentScene == null)
|
if (CurrentScene == null)
|
||||||
{
|
{
|
||||||
lock (m_localScenes)
|
lock (m_localScenes)
|
||||||
m_localScenes.ForEach(func);
|
m_localScenes.ForEach(func);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
func(m_currentScene);
|
func(CurrentScene);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,7 +382,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|| (String.Compare(regionName, "..") == 0)
|
|| (String.Compare(regionName, "..") == 0)
|
||||||
|| (String.Compare(regionName, "/") == 0))
|
|| (String.Compare(regionName, "/") == 0))
|
||||||
{
|
{
|
||||||
m_currentScene = null;
|
CurrentScene = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -393,7 +393,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0)
|
if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0)
|
||||||
{
|
{
|
||||||
m_currentScene = scene;
|
CurrentScene = scene;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -413,7 +413,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (scene.RegionInfo.RegionID == regionID)
|
if (scene.RegionInfo.RegionID == regionID)
|
||||||
{
|
{
|
||||||
m_currentScene = scene;
|
CurrentScene = scene;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue