Add "show script timers" command to show script timers. For debug purposes.

Also, "show sensors" changes to "show script sensors".
user_profiles
Justin Clark-Casey (justincc) 2013-01-10 00:57:49 +00:00
parent a0000a034f
commit b1b4687250
4 changed files with 82 additions and 36 deletions

View File

@ -72,7 +72,7 @@ namespace OpenSim.Framework.Monitoring
/// </summary> /// </summary>
public static double LastMemoryChurn public static double LastMemoryChurn
{ {
get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; } get { if (m_samples.Count > 0) return m_samples.First(); else return 0; }
} }
/// <summary> /// <summary>

View File

@ -61,19 +61,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
public SensorInfo Clone() public SensorInfo Clone()
{ {
SensorInfo s = new SensorInfo(); return (SensorInfo)this.MemberwiseClone();
s.localID = localID;
s.itemID = itemID;
s.interval = interval;
s.next = next;
s.name = name;
s.keyID = keyID;
s.type = type;
s.range = range;
s.arc = arc;
s.host = host;
return s;
} }
} }
@ -701,8 +689,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
lock (SenseRepeatListLock) lock (SenseRepeatListLock)
{ {
foreach (SensorInfo si in SenseRepeaters) foreach (SensorInfo i in SenseRepeaters)
retList.Add(si.Clone()); retList.Add(i.Clone());
} }
return retList; return retList;

View File

@ -35,6 +35,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
{ {
public class Timer public class Timer
{ {
public class TimerInfo
{
public uint localID;
public UUID itemID;
//public double interval;
public long interval;
//public DateTime next;
public long next;
public TimerInfo Clone()
{
return (TimerInfo)this.MemberwiseClone();
}
}
public AsyncCommandManager m_CmdManager; public AsyncCommandManager m_CmdManager;
public int TimersCount public int TimersCount
@ -59,17 +74,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
return localID.ToString() + itemID.ToString(); return localID.ToString() + itemID.ToString();
} }
private class TimerClass private Dictionary<string,TimerInfo> Timers = new Dictionary<string,TimerInfo>();
{
public uint localID;
public UUID itemID;
//public double interval;
public long interval;
//public DateTime next;
public long next;
}
private Dictionary<string,TimerClass> Timers = new Dictionary<string,TimerClass>();
private object TimerListLock = new object(); private object TimerListLock = new object();
public void SetTimerEvent(uint m_localID, UUID m_itemID, double sec) public void SetTimerEvent(uint m_localID, UUID m_itemID, double sec)
@ -81,7 +86,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
} }
// Add to timer // Add to timer
TimerClass ts = new TimerClass(); TimerInfo ts = new TimerInfo();
ts.localID = m_localID; ts.localID = m_localID;
ts.itemID = m_itemID; ts.itemID = m_itemID;
ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait
@ -121,8 +126,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
lock (TimerListLock) lock (TimerListLock)
{ {
// Go through all timers // Go through all timers
Dictionary<string, TimerClass>.ValueCollection tvals = Timers.Values; Dictionary<string, TimerInfo>.ValueCollection tvals = Timers.Values;
foreach (TimerClass ts in tvals) foreach (TimerInfo ts in tvals)
{ {
// Time has passed? // Time has passed?
if (ts.next < DateTime.Now.Ticks) if (ts.next < DateTime.Now.Ticks)
@ -147,8 +152,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
lock (TimerListLock) lock (TimerListLock)
{ {
Dictionary<string, TimerClass>.ValueCollection tvals = Timers.Values; Dictionary<string, TimerInfo>.ValueCollection tvals = Timers.Values;
foreach (TimerClass ts in tvals) foreach (TimerInfo ts in tvals)
{ {
if (ts.itemID == itemID) if (ts.itemID == itemID)
{ {
@ -167,7 +172,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
while (idx < data.Length) while (idx < data.Length)
{ {
TimerClass ts = new TimerClass(); TimerInfo ts = new TimerInfo();
ts.localID = localID; ts.localID = localID;
ts.itemID = itemID; ts.itemID = itemID;
@ -181,5 +186,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
} }
} }
} }
public List<TimerInfo> GetTimersInfo()
{
List<TimerInfo> retList = new List<TimerInfo>();
lock (TimerListLock)
{
foreach (TimerInfo i in Timers.Values)
retList.Add(i.Clone());
}
return retList;
}
} }
} }

View File

@ -47,20 +47,29 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public void RegisterCommands() public void RegisterCommands()
{ {
MainConsole.Instance.Commands.AddCommand( MainConsole.Instance.Commands.AddCommand(
"Scripts", false, "show sensors", "show sensors", "Show script sensors information", "Scripts", false, "show script sensors", "show script sensors", "Show script sensors information",
HandleShowSensors); HandleShowSensors);
MainConsole.Instance.Commands.AddCommand(
"Scripts", false, "show script timers", "show script timers", "Show script sensors information",
HandleShowTimers);
}
private bool IsSceneSelected()
{
return MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_engine.World;
} }
private void HandleShowSensors(string module, string[] cmdparams) private void HandleShowSensors(string module, string[] cmdparams)
{ {
if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_engine.World)) if (!IsSceneSelected())
return; return;
SensorRepeat sr = AsyncCommandManager.GetSensorRepeatPlugin(m_engine); SensorRepeat sr = AsyncCommandManager.GetSensorRepeatPlugin(m_engine);
if (sr == null) if (sr == null)
{ {
MainConsole.Instance.Output("Sensor plugin not yet initialized"); MainConsole.Instance.Output("Plugin not yet initialized");
return; return;
} }
@ -82,5 +91,36 @@ namespace OpenSim.Region.ScriptEngine.XEngine
MainConsole.Instance.Output(cdt.ToString()); MainConsole.Instance.Output(cdt.ToString());
MainConsole.Instance.OutputFormat("Total: {0}", sensorInfo.Count); MainConsole.Instance.OutputFormat("Total: {0}", sensorInfo.Count);
} }
private void HandleShowTimers(string module, string[] cmdparams)
{
if (!IsSceneSelected())
return;
Timer timerPlugin = AsyncCommandManager.GetTimerPlugin(m_engine);
if (timerPlugin == null)
{
MainConsole.Instance.Output("Plugin not yet initialized");
return;
}
List<Timer.TimerInfo> timersInfo = timerPlugin.GetTimersInfo();
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
cdt.AddColumn("Part local ID", 13);
cdt.AddColumn("Script item ID", 36);
cdt.AddColumn("Interval", 10);
cdt.AddColumn("Next", 8);
foreach (Timer.TimerInfo t in timersInfo)
{
// Convert from 100 ns ticks back to seconds
cdt.AddRow(t.localID, t.itemID, (double)t.interval / 10000000, t.next);
}
MainConsole.Instance.Output(cdt.ToString());
MainConsole.Instance.OutputFormat("Total: {0}", timersInfo.Count);
}
} }
} }