From 528004d34988d8d2349f18ff7d78c6dd50ab8b2d Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 18 Jul 2012 23:35:05 +0100
Subject: Perform other region ready actions even if simulator is configured to
leave logins disabled on startup.
---
.../Framework/Interfaces/IRegionReadyModule.cs | 11 +++++-
OpenSim/Region/Framework/Scenes/EventManager.cs | 2 +-
OpenSim/Region/Framework/Scenes/Scene.cs | 37 +++++++++---------
.../RegionReadyModule/RegionReadyModule.cs | 45 +++++++++-------------
4 files changed, 48 insertions(+), 47 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs
index aa4a757..136ca92 100644
--- a/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs
@@ -25,14 +25,23 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
using System;
+using OpenSim.Framework;
namespace OpenSim.Region.Framework.Interfaces
{
public interface IRegionReadyModule
{
void OarLoadingAlert(string msg);
+
+ ///
+ /// Trigger region ready status manually.
+ ///
+ ///
+ /// This should be called by the scene if the IRegionReadyModule has set Scene.LoginLock == true
+ ///
+ ///
+ void TriggerRegionReady(IScene scene);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 714d70d..b8ae0ac 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -2506,7 +2506,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
-
+
public void TriggerRegionReady(IScene scene)
{
RegionReady handler = OnRegionReady;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index cadcec0..00aa0ea 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -702,6 +702,8 @@ namespace OpenSim.Region.Framework.Scenes
{
IConfig startupConfig = m_config.Configs["Startup"];
+ StartDisabled = startupConfig.GetBoolean("StartDisabled", false);
+
m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance);
m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
if (!m_useBackup)
@@ -1484,35 +1486,32 @@ namespace OpenSim.Region.Framework.Scenes
// this is a rare case where we know we have just went through a long cycle of heap
// allocations, and there is no more work to be done until someone logs in
GC.Collect();
-
- IConfig startupConfig = m_config.Configs["Startup"];
- if (startupConfig == null || !startupConfig.GetBoolean("StartDisabled", false))
+
+ if (!LoginLock)
{
- if (LoginLock)
- {
- // This handles a case of a region having no scripts for the RegionReady module
- if (m_sceneGraph.GetActiveScriptsCount() == 0)
- {
- // XXX: need to be able to tell these have changed in RegionReady, since it will not
- // detect a scenario where the region has no scripts - it's listening to the
- // script compile queue.
- EventManager.TriggerLoginsEnabled(this);
- }
- }
- else
+ if (!StartDisabled)
{
m_log.InfoFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName);
LoginsDisabled = false;
EventManager.TriggerLoginsEnabled(this);
- EventManager.TriggerRegionReady(this);
}
- m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface(), RegionInfo);
+ // Region ready should always be triggered whether logins are immediately enabled or not.
+ EventManager.TriggerRegionReady(this);
}
else
{
- StartDisabled = true;
- LoginsDisabled = true;
+ // This handles a case of a region having no scripts for the RegionReady module
+ if (m_sceneGraph.GetActiveScriptsCount() == 0)
+ {
+ // In this case, we leave it to the IRegionReadyModule to enable logins
+
+ // LoginLock can currently only be set by a region module implementation.
+ // If somehow this hasn't been done then the quickest way to bugfix is to see the
+ // NullReferenceException
+ IRegionReadyModule rrm = RequestModuleInterface();
+ rrm.TriggerRegionReady(this);
+ }
}
}
}
diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
index 6b09c3b..8d5b25f 100644
--- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
@@ -31,16 +31,14 @@ using System.Reflection;
using System.Net;
using System.IO;
using System.Text;
-
using log4net;
using Nini.Config;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
-using OpenSim.Services.Interfaces;
-
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
{
@@ -105,7 +103,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
if (m_disable_logins)
{
m_scene.LoginLock = true;
- m_scene.EventManager.OnLoginsEnabled += OnLoginsEnabled;
m_scene.EventManager.OnEmptyScriptCompileQueue += OnEmptyScriptCompileQueue;
m_log.InfoFormat("[RegionReady]: Region {0} - LOGINS DISABLED DURING INITIALIZATION.", m_scene.Name);
@@ -125,15 +122,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
m_scene.EventManager.OnOarFileLoaded -= OnOarFileLoaded;
if (m_disable_logins)
- {
- m_scene.EventManager.OnLoginsEnabled -= OnLoginsEnabled;
m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue;
- }
if (m_uri != string.Empty)
- {
RRAlert("shutdown");
- }
m_scene = null;
}
@@ -186,8 +178,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
m_scene.RegionInfo.RegionName, c.Message, m_channelNotify);
m_scene.EventManager.TriggerOnChatBroadcast(this, c);
- m_scene.EventManager.TriggerLoginsEnabled(m_scene);
- m_scene.SceneGridService.InformNeighborsThatRegionisUp(m_scene.RequestModuleInterface(), m_scene.RegionInfo);
+
+ TriggerRegionReady(m_scene);
}
}
@@ -207,20 +199,18 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
}
///
- /// This will be triggered by Scene directly if it contains no scripts on startup.
+ /// This will be triggered by Scene directly if it contains no scripts on startup. Otherwise it is triggered
+ /// when the script compile queue is empty after initial region startup.
///
- ///
- /// m_ScriptsRezzing will be false if there were none
- /// else it will be true and we should wait on the
- /// empty compile queue
- ///
///
- void OnLoginsEnabled(IScene scene)
+ public void TriggerRegionReady(IScene scene)
{
- if (m_scene.StartDisabled == false)
+ m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue;
+ m_scene.LoginLock = false;
+
+ if (!m_scene.StartDisabled)
{
m_scene.LoginsDisabled = false;
- m_scene.LoginLock = false;
// m_log.InfoFormat("[RegionReady]: Logins enabled for {0}, Oar {1}",
// m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString());
@@ -228,15 +218,18 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
m_log.InfoFormat(
"[RegionReady]: INITIALIZATION COMPLETE FOR {0} - LOGINS ENABLED", m_scene.Name);
- if (m_uri != string.Empty)
- {
- RRAlert("enabled");
- }
+ m_scene.EventManager.TriggerLoginsEnabled(m_scene);
+ }
+
+ m_scene.SceneGridService.InformNeighborsThatRegionisUp(
+ m_scene.RequestModuleInterface(), m_scene.RegionInfo);
- m_scene.EventManager.TriggerRegionReady(m_scene);
+ if (m_uri != string.Empty)
+ {
+ RRAlert("enabled");
}
- m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue;
+ m_scene.EventManager.TriggerRegionReady(m_scene);
}
public void OarLoadingAlert(string msg)
--
cgit v1.1