diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index b304403541..c1d0727dda 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -508,8 +508,7 @@ namespace OpenSim scene.SnmpService.LinkUp(scene); } - scene.StartTimer(); - scene.StartTimerWatchdog(); + scene.Start(); scene.StartScripts(); diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index b5e79b8dd7..7c6df0355e 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -598,12 +598,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain "[TERRAIN]: Could not save terrain from {0} to {1}. Valid file extensions are {2}", m_scene.RegionInfo.RegionName, filename, m_supportedFileExtensions); } - else - { - m_log.ErrorFormat( - "[TERRAIN]: Could not save terrain from {0} to {1}. {2} {3} {4} {5} {6} {7}", - m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY); - } +// else +// { +// m_log.ErrorFormat( +// "[TERRAIN]: Could not save terrain from {0} to {1}. {2} {3} {4} {5} {6} {7}", +// m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY); +// } } /// diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index cded9be47d..f5623bdf69 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -125,7 +125,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation // XXX: For some reason, we store all animations and use them with upper case names, but in LSL animations // are referenced with lower case names! - UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name); + UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name.ToUpper()); if (animID == UUID.Zero) return; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 44a738e716..34ad58af32 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -215,14 +215,12 @@ namespace OpenSim.Region.Framework.Scenes /// private bool m_cleaningTemps = false; - private Object m_heartbeatLock = new Object(); +// private Object m_heartbeatLock = new Object(); // TODO: Possibly stop other classes being able to manipulate this directly. private SceneGraph m_sceneGraph; private volatile int m_bordersLocked; -// private int m_RestartTimerCounter; private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing -// private int m_incrementsof15seconds; private volatile bool m_backingup; private Dictionary m_returns = new Dictionary(); private Dictionary m_groupsWithTargets = new Dictionary(); @@ -230,16 +228,34 @@ namespace OpenSim.Region.Framework.Scenes private bool m_physics_enabled = true; private bool m_scripts_enabled = true; private string m_defaultScriptEngine; - private int m_LastLogin; - private Thread HeartbeatThread = null; - private volatile bool shuttingdown; - private int m_lastUpdate; + /// + /// Tick at which the last login occurred. + /// + private int m_LastLogin; + private int m_lastIncoming; private int m_lastOutgoing; - private bool m_firstHeartbeat = true; private int m_hbRestarts = 0; + + /// + /// Thread that runs the scene loop. + /// + private Thread m_heartbeatThread; + + /// + /// True if these scene is in the process of shutting down or is shutdown. + /// + public bool ShuttingDown + { + get { return m_shuttingDown; } + } + private volatile bool m_shuttingDown; + +// private int m_lastUpdate; + private bool m_firstHeartbeat = true; + private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; private bool m_reprioritizationEnabled = true; private double m_reprioritizationInterval = 5000.0; @@ -577,7 +593,6 @@ namespace OpenSim.Region.Framework.Scenes m_EstateDataService = estateDataService; m_regionHandle = m_regInfo.RegionHandle; m_regionName = m_regInfo.RegionName; - m_lastUpdate = Util.EnvironmentTickCount(); m_lastIncoming = 0; m_lastOutgoing = 0; @@ -834,18 +849,13 @@ namespace OpenSim.Region.Framework.Scenes m_permissions = new ScenePermissions(this); - m_lastUpdate = Util.EnvironmentTickCount(); +// m_lastUpdate = Util.EnvironmentTickCount(); } #endregion #region Startup / Close Methods - public bool ShuttingDown - { - get { return shuttingdown; } - } - /// /// The scene graph for this scene /// @@ -1107,6 +1117,12 @@ namespace OpenSim.Region.Framework.Scenes m_physics_enabled = enablePhysics; } +// if (options.ContainsKey("collisions")) +// { +// // TODO: Implement. If false, should stop objects colliding, though possibly should still allow +// // the avatar themselves to collide with the ground. +// } + if (options.ContainsKey("teleport")) { bool enableTeleportDebugging; @@ -1158,8 +1174,7 @@ namespace OpenSim.Region.Framework.Scenes ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); // Stop updating the scene objects and agents. - //m_heartbeatTimer.Close(); - shuttingdown = true; + m_shuttingDown = true; m_log.Debug("[SCENE]: Persisting changed objects"); EventManager.TriggerSceneShuttingDown(this); @@ -1183,16 +1198,16 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Start the timer which triggers regular scene updates + /// Start the scene /// - public void StartTimer() + public void Start() { // m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName); //m_heartbeatTimer.Enabled = true; //m_heartbeatTimer.Interval = (int)(m_timespan * 1000); //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); - if (HeartbeatThread != null) + if (m_heartbeatThread != null) { m_hbRestarts++; if(m_hbRestarts > 10) @@ -1208,13 +1223,13 @@ namespace OpenSim.Region.Framework.Scenes //proc.WaitForExit(); //Thread.Sleep(1000); //Environment.Exit(1); - HeartbeatThread.Abort(); - Watchdog.AbortThread(HeartbeatThread.ManagedThreadId); - HeartbeatThread = null; + m_heartbeatThread.Abort(); + Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId); + m_heartbeatThread = null; } - m_lastUpdate = Util.EnvironmentTickCount(); +// m_lastUpdate = Util.EnvironmentTickCount(); - HeartbeatThread + m_heartbeatThread = Watchdog.StartThread( Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false); } @@ -1245,30 +1260,32 @@ namespace OpenSim.Region.Framework.Scenes /// private void Heartbeat() { - if (!Monitor.TryEnter(m_heartbeatLock)) - { - Watchdog.RemoveThread(); - return; - } +// if (!Monitor.TryEnter(m_heartbeatLock)) +// { +// Watchdog.RemoveThread(); +// return; +// } - try - { - m_eventManager.TriggerOnRegionStarted(this); +// try +// { - // The first frame can take a very long time due to physics actors being added on startup. Therefore, - // don't turn on the watchdog alarm for this thread until the second frame, in order to prevent false - // alarms for scenes with many objects. - Update(1); - Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true; + m_eventManager.TriggerOnRegionStarted(this); - while (!shuttingdown) - Update(-1); - } - finally - { - Monitor.Pulse(m_heartbeatLock); - Monitor.Exit(m_heartbeatLock); - } + // The first frame can take a very long time due to physics actors being added on startup. Therefore, + // don't turn on the watchdog alarm for this thread until the second frame, in order to prevent false + // alarms for scenes with many objects. + Update(1); + Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true; + Update(-1); + +// m_lastUpdate = Util.EnvironmentTickCount(); +// m_firstHeartbeat = false; +// } +// finally +// { +// Monitor.Pulse(m_heartbeatLock); +// Monitor.Exit(m_heartbeatLock); +// } Watchdog.RemoveThread(); } @@ -1287,7 +1304,7 @@ namespace OpenSim.Region.Framework.Scenes List coarseLocations; List avatarUUIDs; - while (!shuttingdown && (endFrame == null || Frame < endFrame)) + while (!m_shuttingDown && (endFrame == null || Frame < endFrame)) { maintc = Util.EnvironmentTickCount(); ++Frame; @@ -1463,15 +1480,11 @@ namespace OpenSim.Region.Framework.Scenes maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); maintc = (int)(MinFrameTime * 1000) - maintc; - m_lastUpdate = Util.EnvironmentTickCount(); m_firstHeartbeat = false; if (maintc > 0) Thread.Sleep(maintc); - m_lastUpdate = Util.EnvironmentTickCount(); - m_firstHeartbeat = false; - // Optionally warn if a frame takes double the amount of time that it should. if (DebugUpdates && Util.EnvironmentTickCountSubtract( @@ -2662,7 +2675,6 @@ namespace OpenSim.Region.Framework.Scenes || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; CheckHeartbeat(); - ScenePresence presence; ScenePresence sp = GetScenePresence(client.AgentId); @@ -3253,7 +3265,7 @@ namespace OpenSim.Region.Framework.Scenes public override void RemoveClient(UUID agentID, bool closeChildAgents) { - CheckHeartbeat(); +// CheckHeartbeat(); bool isChildAgent = false; ScenePresence avatar = GetScenePresence(agentID); if (avatar != null) @@ -4700,7 +4712,7 @@ namespace OpenSim.Region.Framework.Scenes int health=1; // Start at 1, means we're up - if (Util.EnvironmentTickCountSubtract(m_lastUpdate) < 1000) + if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) { health+=1; flags |= 1; @@ -4737,6 +4749,8 @@ Environment.Exit(1); // if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000) health++; + else + return health; return health; } @@ -4929,8 +4943,8 @@ Environment.Exit(1); if (m_firstHeartbeat) return; - if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 5000) - StartTimer(); + if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000) + Start(); } public override ISceneObject DeserializeObject(string representation) diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs index d0142a40e3..0b9f875e89 100644 --- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs @@ -70,8 +70,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady public void Initialise(IConfigSource config) { - //m_log.Info("[RegionReady] Initialising"); - m_config = config.Configs["RegionReady"]; if (m_config != null) { @@ -84,9 +82,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady m_uri = m_config.GetString("alert_uri",string.Empty); } } - -// if (!m_enabled) -// m_log.Info("[RegionReady] disabled."); } public void AddRegion(Scene scene) @@ -113,7 +108,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady { scene.LoginLock = true; scene.LoginsDisabled = true; - m_log.InfoFormat("[RegionReady]: Logins disabled for {0}",m_scene.RegionInfo.RegionName); + m_log.InfoFormat("[RegionReady]: Region {0} - logins disabled during initialization.",m_scene.RegionInfo.RegionName); if(m_uri != string.Empty) { @@ -167,7 +162,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady void OnEmptyScriptCompileQueue(int numScriptsFailed, string message) { - m_log.InfoFormat("[RegionReady]: Script compile queue empty!"); + m_log.DebugFormat("[RegionReady]: Script compile queue empty!"); if (m_firstEmptyCompileQueue || m_oarFileLoading) { @@ -194,7 +189,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady c.SenderUUID = UUID.Zero; c.Scene = m_scene; - m_log.InfoFormat("[RegionReady]: Region \"{0}\" is ready: \"{1}\" on channel {2}", + m_log.DebugFormat("[RegionReady]: Region \"{0}\" is ready: \"{1}\" on channel {2}", m_scene.RegionInfo.RegionName, c.Message, m_channelNotify); m_scene.EventManager.TriggerOnChatBroadcast(this, c); @@ -210,7 +205,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady { m_lastOarLoadedOk = true; } else { - m_log.InfoFormat("[RegionReady]: Oar file load errors: {0}", message); + m_log.WarnFormat("[RegionReady]: Oar file load errors: {0}", message); m_lastOarLoadedOk = false; } } @@ -233,7 +228,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady // m_log.InfoFormat("[RegionReady]: Logins enabled for {0}, Oar {1}", // m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString()); - m_log.InfoFormat("[RegionReady]: Logins enabled for {0}", m_scene.RegionInfo.RegionName); + m_log.InfoFormat("[RegionReady]: Initialization complete - logins enabled for {0}", m_scene.RegionInfo.RegionName); if ( m_uri != string.Empty ) { diff --git a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs index ed62f95f46..f83a23998a 100644 --- a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs +++ b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs @@ -73,17 +73,19 @@ namespace OpenSim.Server.Handlers.Login if (requestData != null) { - foreach (string key in requestData.Keys) - { - object value = requestData[key]; - Console.WriteLine("{0}:{1}", key, value); - if (value is ArrayList) - { - ICollection col = value as ICollection; - foreach (object item in col) - Console.WriteLine(" {0}", item); - } - } + // Debug code to show exactly what login parameters the viewer is sending us. + // TODO: Extract into a method that can be generally applied if one doesn't already exist. +// foreach (string key in requestData.Keys) +// { +// object value = requestData[key]; +// Console.WriteLine("{0}:{1}", key, value); +// if (value is ArrayList) +// { +// ICollection col = value as ICollection; +// foreach (object item in col) +// Console.WriteLine(" {0}", item); +// } +// } if (requestData.ContainsKey("first") && requestData["first"] != null && requestData.ContainsKey("last") && requestData["last"] != null && (