aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/GcNotify.cs62
-rw-r--r--OpenSim/Region/Application/OpenSim.cs34
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs97
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs2
5 files changed, 143 insertions, 60 deletions
diff --git a/OpenSim/Framework/GcNotify.cs b/OpenSim/Framework/GcNotify.cs
new file mode 100644
index 0000000..14a22a6
--- /dev/null
+++ b/OpenSim/Framework/GcNotify.cs
@@ -0,0 +1,62 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using log4net;
31
32public class GcNotify
33{
34 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
35
36 public static bool Enabled
37 {
38 get { return s_initialized; }
39 set
40 {
41 if (!s_initialized && value)
42 new GcNotify();
43
44 s_initialized = value;
45 }
46 }
47
48 private static bool s_initialized = false;
49
50 private GcNotify() {}
51
52 ~GcNotify()
53 {
54 if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload())
55 {
56 m_log.DebugFormat("[GC NOTIFY]: Garbage collection triggered.");
57
58 if (Enabled)
59 new GcNotify();
60 }
61 }
62} \ No newline at end of file
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index e955a58..59b6b21 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -919,7 +919,7 @@ namespace OpenSim
919 break; 919 break;
920 920
921 case "scene": 921 case "scene":
922 if (args.Length == 5) 922 if (args.Length == 4)
923 { 923 {
924 if (m_sceneManager.CurrentScene == null) 924 if (m_sceneManager.CurrentScene == null)
925 { 925 {
@@ -927,39 +927,21 @@ namespace OpenSim
927 } 927 }
928 else 928 else
929 { 929 {
930 bool scriptingOn = !Convert.ToBoolean(args[2]); 930 string key = args[2];
931 bool collisionsOn = !Convert.ToBoolean(args[3]); 931 string value = args[3];
932 bool physicsOn = !Convert.ToBoolean(args[4]); 932 m_sceneManager.CurrentScene.SetSceneCoreDebug(
933 m_sceneManager.CurrentScene.SetSceneCoreDebug(scriptingOn, collisionsOn, physicsOn); 933 new Dictionary<string, string>() { { key, value } });
934 934
935 MainConsole.Instance.Output( 935 MainConsole.Instance.OutputFormat("Set debug scene {0} = {1}", key, value);
936 String.Format(
937 "Set debug scene scripting = {0}, collisions = {1}, physics = {2}",
938 !scriptingOn, !collisionsOn, !physicsOn));
939 } 936 }
940 } 937 }
941 else 938 else
942 { 939 {
943 MainConsole.Instance.Output("Usage: debug scene <scripting> <collisions> <physics> (where inside <> is true/false)"); 940 MainConsole.Instance.Output("Usage: debug scene scripting|collisions|physics|teleport true|false");
944 } 941 }
945 942
946 break; 943 break;
947 944
948 case "teleport":
949 foreach(Scene s in m_sceneManager.Scenes)
950 {
951 if (s.DEBUG)
952 {
953 s.DEBUG = false;
954 MainConsole.Instance.Output("Teleport debugging is disabled!");
955 }
956 else{
957 s.DEBUG = true;
958 MainConsole.Instance.Output("Teleport debugging is enabled!");
959 }
960 }
961 break;
962
963 default: 945 default:
964 MainConsole.Instance.Output("Unknown debug command"); 946 MainConsole.Instance.Output("Unknown debug command");
965 break; 947 break;
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index 1adeb88..fc217b0 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -670,7 +670,13 @@ namespace OpenSim.Region.CoreModules.World.Estate
670 Scene.RegionInfo.RegionSettings.Save(); 670 Scene.RegionInfo.RegionSettings.Save();
671 TriggerRegionInfoChange(); 671 TriggerRegionInfoChange();
672 672
673 Scene.SetSceneCoreDebug(disableScripts, disableCollisions, disablePhysics); 673 Scene.SetSceneCoreDebug(
674 new Dictionary<string, string>() {
675 { "scripting", (!disableScripts).ToString() },
676 { "collisions", (!disableCollisions).ToString() },
677 { "physics", (!disablePhysics).ToString() }
678 }
679 );
674 } 680 }
675 681
676 private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey) 682 private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 790ec63..76e632e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -65,7 +65,16 @@ namespace OpenSim.Region.Framework.Scenes
65 #region Fields 65 #region Fields
66 66
67 public bool EmergencyMonitoring = false; 67 public bool EmergencyMonitoring = false;
68 public bool DEBUG = false; 68
69 /// <summary>
70 /// Show debug information about teleports.
71 /// </summary>
72 public bool DebugTeleporting { get; private set; }
73
74 /// <summary>
75 /// Show debug information about the scene loop.
76 /// </summary>
77 public bool DebugUpdates { get; private set; }
69 78
70 public SynchronizeSceneHandler SynchronizeScene; 79 public SynchronizeSceneHandler SynchronizeScene;
71 public SimStatsReporter StatsReporter; 80 public SimStatsReporter StatsReporter;
@@ -1020,44 +1029,66 @@ namespace OpenSim.Region.Framework.Scenes
1020 } 1029 }
1021 } 1030 }
1022 1031
1023 public void SetSceneCoreDebug(bool ScriptEngine, bool CollisionEvents, bool PhysicsEngine) 1032 public void SetSceneCoreDebug(Dictionary<string, string> options)
1024 { 1033 {
1025 if (m_scripts_enabled != !ScriptEngine) 1034 if (options.ContainsKey("scripting"))
1026 { 1035 {
1027 if (ScriptEngine) 1036 bool enableScripts = true;
1037 if (bool.TryParse(options["scripting"], out enableScripts) && m_scripts_enabled != enableScripts)
1028 { 1038 {
1029 m_log.Info("Stopping all Scripts in Scene"); 1039 if (!enableScripts)
1030
1031 EntityBase[] entities = Entities.GetEntities();
1032 foreach (EntityBase ent in entities)
1033 { 1040 {
1034 if (ent is SceneObjectGroup) 1041 m_log.Info("Stopping all Scripts in Scene");
1035 ((SceneObjectGroup)ent).RemoveScriptInstances(false); 1042
1043 EntityBase[] entities = Entities.GetEntities();
1044 foreach (EntityBase ent in entities)
1045 {
1046 if (ent is SceneObjectGroup)
1047 ((SceneObjectGroup)ent).RemoveScriptInstances(false);
1048 }
1036 } 1049 }
1037 } 1050 else
1038 else
1039 {
1040 m_log.Info("Starting all Scripts in Scene");
1041
1042 EntityBase[] entities = Entities.GetEntities();
1043 foreach (EntityBase ent in entities)
1044 { 1051 {
1045 if (ent is SceneObjectGroup) 1052 m_log.Info("Starting all Scripts in Scene");
1053
1054 EntityBase[] entities = Entities.GetEntities();
1055 foreach (EntityBase ent in entities)
1046 { 1056 {
1047 SceneObjectGroup sog = (SceneObjectGroup)ent; 1057 if (ent is SceneObjectGroup)
1048 sog.CreateScriptInstances(0, false, DefaultScriptEngine, 0); 1058 {
1049 sog.ResumeScripts(); 1059 SceneObjectGroup sog = (SceneObjectGroup)ent;
1060 sog.CreateScriptInstances(0, false, DefaultScriptEngine, 0);
1061 sog.ResumeScripts();
1062 }
1050 } 1063 }
1051 } 1064 }
1065
1066 m_scripts_enabled = enableScripts;
1052 } 1067 }
1068 }
1053 1069
1054 m_scripts_enabled = !ScriptEngine; 1070 if (options.ContainsKey("physics"))
1055 m_log.Info("[TOTEDD]: Here is the method to trigger disabling of the scripting engine"); 1071 {
1072 bool enablePhysics;
1073 if (bool.TryParse(options["physics"], out enablePhysics))
1074 m_physics_enabled = enablePhysics;
1075 }
1076
1077 if (options.ContainsKey("teleport"))
1078 {
1079 bool enableTeleportDebugging;
1080 if (bool.TryParse(options["teleport"], out enableTeleportDebugging))
1081 DebugTeleporting = enableTeleportDebugging;
1056 } 1082 }
1057 1083
1058 if (m_physics_enabled != !PhysicsEngine) 1084 if (options.ContainsKey("updates"))
1059 { 1085 {
1060 m_physics_enabled = !PhysicsEngine; 1086 bool enableUpdateDebugging;
1087 if (bool.TryParse(options["updates"], out enableUpdateDebugging))
1088 {
1089 DebugUpdates = enableUpdateDebugging;
1090 GcNotify.Enabled = DebugUpdates;
1091 }
1061 } 1092 }
1062 } 1093 }
1063 1094
@@ -1382,7 +1413,7 @@ namespace OpenSim.Region.Framework.Scenes
1382 // Tell the watchdog that this thread is still alive 1413 // Tell the watchdog that this thread is still alive
1383 Watchdog.UpdateThread(); 1414 Watchdog.UpdateThread();
1384 1415
1385// previousFrameTick = m_lastFrameTick; 1416 previousFrameTick = m_lastFrameTick;
1386 m_lastFrameTick = Util.EnvironmentTickCount(); 1417 m_lastFrameTick = Util.EnvironmentTickCount();
1387 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); 1418 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc);
1388 maintc = (int)(MinFrameTime * 1000) - maintc; 1419 maintc = (int)(MinFrameTime * 1000) - maintc;
@@ -1391,12 +1422,14 @@ namespace OpenSim.Region.Framework.Scenes
1391 Thread.Sleep(maintc); 1422 Thread.Sleep(maintc);
1392 1423
1393 // Optionally warn if a frame takes double the amount of time that it should. 1424 // Optionally warn if a frame takes double the amount of time that it should.
1394// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick, previousFrameTick) > (int)(MinFrameTime * 1000 * 2)) 1425 if (DebugUpdates
1395// m_log.WarnFormat( 1426 && Util.EnvironmentTickCountSubtract(
1396// "[SCENE]: Frame took {0} ms (desired max {1} ms) in {2}", 1427 m_lastFrameTick, previousFrameTick) > (int)(MinFrameTime * 1000 * 2))
1397// Util.EnvironmentTickCountSubtract(m_lastFrameTick, previousFrameTick), 1428 m_log.WarnFormat(
1398// MinFrameTime * 1000, 1429 "[SCENE]: Frame took {0} ms (desired max {1} ms) in {2}",
1399// RegionInfo.RegionName); 1430 Util.EnvironmentTickCountSubtract(m_lastFrameTick, previousFrameTick),
1431 MinFrameTime * 1000,
1432 RegionInfo.RegionName);
1400 } 1433 }
1401 } 1434 }
1402 1435
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 704d12d..cf60c69 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3826,7 +3826,7 @@ namespace OpenSim.Region.Framework.Scenes
3826 ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y); 3826 ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
3827 if (land != null) 3827 if (land != null)
3828 { 3828 {
3829 if (Scene.DEBUG) 3829 if (Scene.DebugTeleporting)
3830 TeleportFlagsDebug(); 3830 TeleportFlagsDebug();
3831 3831
3832 // If we come in via login, landmark or map, we want to 3832 // If we come in via login, landmark or map, we want to