Add "show script timers" command to show script timers. For debug purposes.
Also, "show sensors" changes to "show script sensors".0.7.4-extended
parent
be5c6658bb
commit
10c1b15f12
|
@ -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>
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -702,8 +690,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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue