diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/XEngine/XEngine.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 61 |
1 files changed, 59 insertions, 2 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index ee5f519..eb10975 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -448,6 +448,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
448 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) | 448 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) |
449 | return; | 449 | return; |
450 | 450 | ||
451 | MainConsole.Instance.OutputFormat(GetStatusReport()); | ||
452 | } | ||
453 | |||
454 | public string GetStatusReport() | ||
455 | { | ||
451 | StringBuilder sb = new StringBuilder(); | 456 | StringBuilder sb = new StringBuilder(); |
452 | sb.AppendFormat("Status of XEngine instance for {0}\n", m_Scene.RegionInfo.RegionName); | 457 | sb.AppendFormat("Status of XEngine instance for {0}\n", m_Scene.RegionInfo.RegionName); |
453 | 458 | ||
@@ -475,7 +480,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
475 | Listener l = AsyncCommandManager.GetListenerPlugin(this); | 480 | Listener l = AsyncCommandManager.GetListenerPlugin(this); |
476 | sb.AppendFormat("Listeners : {0}\n", l.ListenerCount); | 481 | sb.AppendFormat("Listeners : {0}\n", l.ListenerCount); |
477 | 482 | ||
478 | MainConsole.Instance.OutputFormat(sb.ToString()); | 483 | return sb.ToString(); |
479 | } | 484 | } |
480 | 485 | ||
481 | public void HandleShowScripts(string module, string[] cmdparams) | 486 | public void HandleShowScripts(string module, string[] cmdparams) |
@@ -1154,7 +1159,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1154 | 1159 | ||
1155 | if (!m_PrimObjects[localID].Contains(itemID)) | 1160 | if (!m_PrimObjects[localID].Contains(itemID)) |
1156 | m_PrimObjects[localID].Add(itemID); | 1161 | m_PrimObjects[localID].Add(itemID); |
1157 | |||
1158 | } | 1162 | } |
1159 | 1163 | ||
1160 | if (!m_Assemblies.ContainsKey(assetID)) | 1164 | if (!m_Assemblies.ContainsKey(assetID)) |
@@ -1981,6 +1985,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1981 | } | 1985 | } |
1982 | } | 1986 | } |
1983 | 1987 | ||
1988 | public Dictionary<uint, float> GetObjectScriptsExecutionTimes() | ||
1989 | { | ||
1990 | long tickNow = Util.EnvironmentTickCount(); | ||
1991 | Dictionary<uint, float> topScripts = new Dictionary<uint, float>(); | ||
1992 | |||
1993 | lock (m_Scripts) | ||
1994 | { | ||
1995 | foreach (IScriptInstance si in m_Scripts.Values) | ||
1996 | { | ||
1997 | if (!topScripts.ContainsKey(si.LocalID)) | ||
1998 | topScripts[si.RootLocalID] = 0; | ||
1999 | |||
2000 | // long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
2001 | // float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); | ||
2002 | |||
2003 | // Execution time of the script adjusted by it's measurement period to make scripts started at | ||
2004 | // different times comparable. | ||
2005 | // float adjustedExecutionTime | ||
2006 | // = (float)si.MeasurementPeriodExecutionTime | ||
2007 | // / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod) | ||
2008 | // / TimeSpan.TicksPerMillisecond; | ||
2009 | |||
2010 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
2011 | |||
2012 | // Avoid divide by zerp | ||
2013 | if (ticksElapsed == 0) | ||
2014 | ticksElapsed = 1; | ||
2015 | |||
2016 | // Scale execution time to the ideal 55 fps frame time for these reasons. | ||
2017 | // | ||
2018 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
2019 | // 'script execution time per frame', which is the original purpose of this value. | ||
2020 | // | ||
2021 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
2022 | // it impossible to compare scripts. | ||
2023 | // | ||
2024 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
2025 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
2026 | // for much longer. | ||
2027 | // | ||
2028 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
2029 | // since the figure does not represent actual execution time and very hard running scripts will | ||
2030 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
2031 | float adjustedExecutionTime | ||
2032 | = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
2033 | |||
2034 | topScripts[si.RootLocalID] += adjustedExecutionTime; | ||
2035 | } | ||
2036 | } | ||
2037 | |||
2038 | return topScripts; | ||
2039 | } | ||
2040 | |||
1984 | public void SuspendScript(UUID itemID) | 2041 | public void SuspendScript(UUID itemID) |
1985 | { | 2042 | { |
1986 | // m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); | 2043 | // m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); |