diff options
Diffstat (limited to 'OpenSim/Framework/Monitoring')
-rw-r--r-- | OpenSim/Framework/Monitoring/StatsManager.cs | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs index 31989e5..116b2c0 100644 --- a/OpenSim/Framework/Monitoring/StatsManager.cs +++ b/OpenSim/Framework/Monitoring/StatsManager.cs | |||
@@ -249,6 +249,19 @@ namespace OpenSim.Framework.Monitoring | |||
249 | } | 249 | } |
250 | 250 | ||
251 | /// <summary> | 251 | /// <summary> |
252 | /// Stat type. | ||
253 | /// </summary> | ||
254 | /// <remarks> | ||
255 | /// A push stat is one which is continually updated and so it's value can simply by read. | ||
256 | /// A pull stat is one where reading the value triggers a collection method - the stat is not continually updated. | ||
257 | /// </remarks> | ||
258 | public enum StatType | ||
259 | { | ||
260 | Push, | ||
261 | Pull | ||
262 | } | ||
263 | |||
264 | /// <summary> | ||
252 | /// Verbosity of stat. | 265 | /// Verbosity of stat. |
253 | /// </summary> | 266 | /// </summary> |
254 | /// <remarks> | 267 | /// <remarks> |
@@ -285,29 +298,65 @@ namespace OpenSim.Framework.Monitoring | |||
285 | /// </value> | 298 | /// </value> |
286 | public string Container { get; private set; } | 299 | public string Container { get; private set; } |
287 | 300 | ||
301 | public StatType StatType { get; private set; } | ||
302 | |||
303 | /// <summary> | ||
304 | /// Action used to update this stat when the value is requested if it's a pull type. | ||
305 | /// </summary> | ||
306 | public Action<Stat> PullAction { get; private set; } | ||
307 | |||
288 | public StatVerbosity Verbosity { get; private set; } | 308 | public StatVerbosity Verbosity { get; private set; } |
289 | public string ShortName { get; private set; } | 309 | public string ShortName { get; private set; } |
290 | public string Name { get; private set; } | 310 | public string Name { get; private set; } |
291 | public string Description { get; private set; } | 311 | public string Description { get; private set; } |
292 | public virtual string UnitName { get; private set; } | 312 | public virtual string UnitName { get; private set; } |
293 | 313 | ||
294 | public virtual double Value { get; set; } | 314 | public virtual double Value |
315 | { | ||
316 | get | ||
317 | { | ||
318 | // Asking for an update here means that the updater cannot access this value without infinite recursion. | ||
319 | // XXX: A slightly messy but simple solution may be to flick a flag so we can tell if this is being | ||
320 | // called by the pull action and just return the value. | ||
321 | if (StatType == StatType.Pull) | ||
322 | PullAction(this); | ||
323 | |||
324 | return m_value; | ||
325 | } | ||
326 | |||
327 | set | ||
328 | { | ||
329 | m_value = value; | ||
330 | } | ||
331 | } | ||
332 | |||
333 | private double m_value; | ||
295 | 334 | ||
296 | /// <summary> | 335 | /// <summary> |
297 | /// Constructor | 336 | /// Constructor |
298 | /// </summary> | 337 | /// </summary> |
299 | /// <param name='shortName'>Short name for the stat. Must not contain spaces. e.g. "LongFrames"</param> | 338 | /// <param name='shortName'>Short name for the stat. Must not contain spaces. e.g. "LongFrames"</param> |
300 | /// <param name='name'>Human readable name for the stat. e.g. "Long frames"</param> | 339 | /// <param name='name'>Human readable name for the stat. e.g. "Long frames"</param> |
340 | /// <param name='description'>Description of stat</param> | ||
301 | /// <param name='unitName'> | 341 | /// <param name='unitName'> |
302 | /// Unit name for the stat. Should be preceeded by a space if the unit name isn't normally appeneded immediately to the value. | 342 | /// Unit name for the stat. Should be preceeded by a space if the unit name isn't normally appeneded immediately to the value. |
303 | /// e.g. " frames" | 343 | /// e.g. " frames" |
304 | /// </param> | 344 | /// </param> |
305 | /// <param name='category'>Category under which this stat should appear, e.g. "scene". Do not capitalize.</param> | 345 | /// <param name='category'>Category under which this stat should appear, e.g. "scene". Do not capitalize.</param> |
306 | /// <param name='container'>Entity to which this stat relates. e.g. scene name if this is a per scene stat.</param> | 346 | /// <param name='container'>Entity to which this stat relates. e.g. scene name if this is a per scene stat.</param> |
347 | /// <param name='type'>Push or pull</param> | ||
348 | /// <param name='pullAction'>Pull stats need an action to update the stat on request. Push stats should set null here.</param> | ||
307 | /// <param name='verbosity'>Verbosity of stat. Controls whether it will appear in short stat display or only full display.</param> | 349 | /// <param name='verbosity'>Verbosity of stat. Controls whether it will appear in short stat display or only full display.</param> |
308 | /// <param name='description'>Description of stat</param> | ||
309 | public Stat( | 350 | public Stat( |
310 | string shortName, string name, string unitName, string category, string container, StatVerbosity verbosity, string description) | 351 | string shortName, |
352 | string name, | ||
353 | string description, | ||
354 | string unitName, | ||
355 | string category, | ||
356 | string container, | ||
357 | StatType type, | ||
358 | Action<Stat> pullAction, | ||
359 | StatVerbosity verbosity) | ||
311 | { | 360 | { |
312 | if (StatsManager.SubCommands.Contains(category)) | 361 | if (StatsManager.SubCommands.Contains(category)) |
313 | throw new Exception( | 362 | throw new Exception( |
@@ -315,11 +364,18 @@ namespace OpenSim.Framework.Monitoring | |||
315 | 364 | ||
316 | ShortName = shortName; | 365 | ShortName = shortName; |
317 | Name = name; | 366 | Name = name; |
367 | Description = description; | ||
318 | UnitName = unitName; | 368 | UnitName = unitName; |
319 | Category = category; | 369 | Category = category; |
320 | Container = container; | 370 | Container = container; |
371 | StatType = type; | ||
372 | |||
373 | if (StatType == StatType.Push && pullAction != null) | ||
374 | throw new Exception("A push stat cannot have a pull action"); | ||
375 | else | ||
376 | PullAction = pullAction; | ||
377 | |||
321 | Verbosity = verbosity; | 378 | Verbosity = verbosity; |
322 | Description = description; | ||
323 | 379 | ||
324 | UniqueName = GenUniqueName(Container, Category, ShortName); | 380 | UniqueName = GenUniqueName(Container, Category, ShortName); |
325 | } | 381 | } |
@@ -361,8 +417,15 @@ namespace OpenSim.Framework.Monitoring | |||
361 | } | 417 | } |
362 | 418 | ||
363 | public PercentageStat( | 419 | public PercentageStat( |
364 | string shortName, string name, string category, string container, StatVerbosity verbosity, string description) | 420 | string shortName, |
365 | : base(shortName, name, "%", category, container, verbosity, description) {} | 421 | string name, |
422 | string description, | ||
423 | string category, | ||
424 | string container, | ||
425 | StatType type, | ||
426 | Action<Stat> pullAction, | ||
427 | StatVerbosity verbosity) | ||
428 | : base(shortName, name, description, "%", category, container, type, pullAction, verbosity) {} | ||
366 | 429 | ||
367 | public override string ToConsoleString() | 430 | public override string ToConsoleString() |
368 | { | 431 | { |