VirtualBox

source: vbox/trunk/include/VBox/vmm/stam.h@ 39798

Last change on this file since 39798 was 35361, checked in by vboxsync, 14 years ago

fix OSE

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 43.0 KB
Line 
1/** @file
2 * STAM - Statistics Manager.
3 */
4
5/*
6 * Copyright (C) 2006-2010 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_vmm_stam_h
27#define ___VBox_vmm_stam_h
28
29#include <VBox/types.h>
30#include <iprt/stdarg.h>
31#ifdef _MSC_VER
32# if _MSC_VER >= 1400
33# include <intrin.h>
34# endif
35#endif
36
37RT_C_DECLS_BEGIN
38
39/** @defgroup grp_stam The Statistics Manager API
40 * @{
41 */
42
43#if defined(VBOX_WITHOUT_RELEASE_STATISTICS) && defined(VBOX_WITH_STATISTICS)
44# error "Both VBOX_WITHOUT_RELEASE_STATISTICS and VBOX_WITH_STATISTICS are defined! Make up your mind!"
45#endif
46
47
48/** @def STAM_GET_TS
49 * Gets the CPU timestamp counter.
50 *
51 * @param u64 The 64-bit variable which the timestamp shall be saved in.
52 */
53#ifdef __GNUC__
54# if defined(RT_ARCH_X86)
55 /* This produces optimal assembler code for x86 but does not work for AMD64 ('A' means 'either rax or rdx') */
56# define STAM_GET_TS(u64) __asm__ __volatile__ ("rdtsc\n\t" : "=A" (u64))
57# elif defined(RT_ARCH_AMD64)
58# define STAM_GET_TS(u64) \
59 do { uint64_t low; uint64_t high; \
60 __asm__ __volatile__ ("rdtsc\n\t" : "=a"(low), "=d"(high)); \
61 (u64) = ((high << 32) | low); \
62 } while (0)
63# endif
64#else
65# if _MSC_VER >= 1400
66# pragma intrinsic(__rdtsc)
67# define STAM_GET_TS(u64) \
68 do { (u64) = __rdtsc(); } while (0)
69# else
70# define STAM_GET_TS(u64) \
71 do { \
72 uint64_t u64Tmp; \
73 __asm { \
74 __asm rdtsc \
75 __asm mov dword ptr [u64Tmp], eax \
76 __asm mov dword ptr [u64Tmp + 4], edx \
77 } \
78 (u64) = u64Tmp; \
79 } while (0)
80# endif
81#endif
82
83
84/** @def STAM_REL_STATS
85 * Code for inclusion only when VBOX_WITH_STATISTICS is defined.
86 * @param code A code block enclosed in {}.
87 */
88#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
89# define STAM_REL_STATS(code) do code while(0)
90#else
91# define STAM_REL_STATS(code) do {} while(0)
92#endif
93/** @def STAM_STATS
94 * Code for inclusion only when VBOX_WITH_STATISTICS is defined.
95 * @param code A code block enclosed in {}.
96 */
97#ifdef VBOX_WITH_STATISTICS
98# define STAM_STATS(code) STAM_REL_STATS(code)
99#else
100# define STAM_STATS(code) do {} while(0)
101#endif
102
103
104/**
105 * Sample type.
106 */
107typedef enum STAMTYPE
108{
109 /** Invalid entry. */
110 STAMTYPE_INVALID = 0,
111 /** Generic counter. */
112 STAMTYPE_COUNTER,
113 /** Profiling of an function. */
114 STAMTYPE_PROFILE,
115 /** Profiling of an operation. */
116 STAMTYPE_PROFILE_ADV,
117 /** Ratio of A to B, uint32_t types. Not reset. */
118 STAMTYPE_RATIO_U32,
119 /** Ratio of A to B, uint32_t types. Reset both to 0. */
120 STAMTYPE_RATIO_U32_RESET,
121 /** Callback. */
122 STAMTYPE_CALLBACK,
123 /** Generic unsigned 8-bit value. Not reset. */
124 STAMTYPE_U8,
125 /** Generic unsigned 8-bit value. Reset to 0. */
126 STAMTYPE_U8_RESET,
127 /** Generic hexadecimal unsigned 8-bit value. Not reset. */
128 STAMTYPE_X8,
129 /** Generic hexadecimal unsigned 8-bit value. Reset to 0. */
130 STAMTYPE_X8_RESET,
131 /** Generic unsigned 16-bit value. Not reset. */
132 STAMTYPE_U16,
133 /** Generic unsigned 16-bit value. Reset to 0. */
134 STAMTYPE_U16_RESET,
135 /** Generic hexadecimal unsigned 16-bit value. Not reset. */
136 STAMTYPE_X16,
137 /** Generic hexadecimal unsigned 16-bit value. Reset to 0. */
138 STAMTYPE_X16_RESET,
139 /** Generic unsigned 32-bit value. Not reset. */
140 STAMTYPE_U32,
141 /** Generic unsigned 32-bit value. Reset to 0. */
142 STAMTYPE_U32_RESET,
143 /** Generic hexadecimal unsigned 32-bit value. Not reset. */
144 STAMTYPE_X32,
145 /** Generic hexadecimal unsigned 32-bit value. Reset to 0. */
146 STAMTYPE_X32_RESET,
147 /** Generic unsigned 64-bit value. Not reset. */
148 STAMTYPE_U64,
149 /** Generic unsigned 64-bit value. Reset to 0. */
150 STAMTYPE_U64_RESET,
151 /** Generic hexadecimal unsigned 64-bit value. Not reset. */
152 STAMTYPE_X64,
153 /** Generic hexadecimal unsigned 64-bit value. Reset to 0. */
154 STAMTYPE_X64_RESET,
155 /** The end (exclusive). */
156 STAMTYPE_END
157} STAMTYPE;
158
159/**
160 * Sample visibility type.
161 */
162typedef enum STAMVISIBILITY
163{
164 /** Invalid entry. */
165 STAMVISIBILITY_INVALID = 0,
166 /** Always visible. */
167 STAMVISIBILITY_ALWAYS,
168 /** Only visible when used (/hit). */
169 STAMVISIBILITY_USED,
170 /** Not visible in the GUI. */
171 STAMVISIBILITY_NOT_GUI,
172 /** The end (exclusive). */
173 STAMVISIBILITY_END
174} STAMVISIBILITY;
175
176/**
177 * Sample unit.
178 */
179typedef enum STAMUNIT
180{
181 /** Invalid entry .*/
182 STAMUNIT_INVALID = 0,
183 /** No unit. */
184 STAMUNIT_NONE,
185 /** Number of calls. */
186 STAMUNIT_CALLS,
187 /** Count of whatever. */
188 STAMUNIT_COUNT,
189 /** Count of bytes. */
190 STAMUNIT_BYTES,
191 /** Count of bytes. */
192 STAMUNIT_PAGES,
193 /** Error count. */
194 STAMUNIT_ERRORS,
195 /** Number of occurences. */
196 STAMUNIT_OCCURENCES,
197 /** Ticks. */
198 STAMUNIT_TICKS,
199 /** Ticks per call. */
200 STAMUNIT_TICKS_PER_CALL,
201 /** Ticks per occurence. */
202 STAMUNIT_TICKS_PER_OCCURENCE,
203 /** Ratio of good vs. bad. */
204 STAMUNIT_GOOD_BAD,
205 /** Megabytes. */
206 STAMUNIT_MEGABYTES,
207 /** Kilobytes. */
208 STAMUNIT_KILOBYTES,
209 /** Nano seconds. */
210 STAMUNIT_NS,
211 /** Nanoseconds per call. */
212 STAMUNIT_NS_PER_CALL,
213 /** Nanoseconds per call. */
214 STAMUNIT_NS_PER_OCCURENCE,
215 /** Percentage. */
216 STAMUNIT_PCT,
217 /** Hertz. */
218 STAMUNIT_HZ,
219 /** The end (exclusive). */
220 STAMUNIT_END
221} STAMUNIT;
222
223
224/** @def STAM_REL_U8_INC
225 * Increments a uint8_t sample by one.
226 *
227 * @param pCounter Pointer to the uint8_t variable to operate on.
228 */
229#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
230# define STAM_REL_U8_INC(pCounter) \
231 do { ++*(pCounter); } while (0)
232#else
233# define STAM_REL_U8_INC(pCounter) do { } while (0)
234#endif
235/** @def STAM_U8_INC
236 * Increments a uint8_t sample by one.
237 *
238 * @param pCounter Pointer to the uint8_t variable to operate on.
239 */
240#ifdef VBOX_WITH_STATISTICS
241# define STAM_U8_INC(pCounter) STAM_REL_U8_INC(pCounter)
242#else
243# define STAM_U8_INC(pCounter) do { } while (0)
244#endif
245
246
247/** @def STAM_REL_U8_DEC
248 * Decrements a uint8_t sample by one.
249 *
250 * @param pCounter Pointer to the uint8_t variable to operate on.
251 */
252#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
253# define STAM_REL_U8_DEC(pCounter) \
254 do { --*(pCounter); } while (0)
255#else
256# define STAM_REL_U8_DEC(pCounter) do { } while (0)
257#endif
258/** @def STAM_U8_DEC
259 * Decrements a uint8_t sample by one.
260 *
261 * @param pCounter Pointer to the uint8_t variable to operate on.
262 */
263#ifdef VBOX_WITH_STATISTICS
264# define STAM_U8_DEC(pCounter) STAM_REL_U8_DEC(pCounter)
265#else
266# define STAM_U8_DEC(pCounter) do { } while (0)
267#endif
268
269
270/** @def STAM_REL_U8_ADD
271 * Increments a uint8_t sample by a value.
272 *
273 * @param pCounter Pointer to the uint8_t variable to operate on.
274 * @param Addend The value to add.
275 */
276#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
277# define STAM_REL_U8_ADD(pCounter, Addend) \
278 do { *(pCounter) += (Addend); } while (0)
279#else
280# define STAM_REL_U8_ADD(pCounter, Addend) do { } while (0)
281#endif
282/** @def STAM_U8_ADD
283 * Increments a uint8_t sample by a value.
284 *
285 * @param pCounter Pointer to the uint8_t variable to operate on.
286 * @param Addend The value to add.
287 */
288#ifdef VBOX_WITH_STATISTICS
289# define STAM_U8_ADD(pCounter, Addend) STAM_REL_U8_ADD(pCounter, Addend
290#else
291# define STAM_U8_ADD(pCounter, Addend) do { } while (0)
292#endif
293
294
295/** @def STAM_REL_U16_INC
296 * Increments a uint16_t sample by one.
297 *
298 * @param pCounter Pointer to the uint16_t variable to operate on.
299 */
300#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
301# define STAM_REL_U16_INC(pCounter) \
302 do { ++*(pCounter); } while (0)
303#else
304# define STAM_REL_U16_INC(pCounter) do { } while (0)
305#endif
306/** @def STAM_U16_INC
307 * Increments a uint16_t sample by one.
308 *
309 * @param pCounter Pointer to the uint16_t variable to operate on.
310 */
311#ifdef VBOX_WITH_STATISTICS
312# define STAM_U16_INC(pCounter) STAM_REL_U16_INC(pCounter)
313#else
314# define STAM_U16_INC(pCounter) do { } while (0)
315#endif
316
317
318/** @def STAM_REL_U16_DEC
319 * Decrements a uint16_t sample by one.
320 *
321 * @param pCounter Pointer to the uint16_t variable to operate on.
322 */
323#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
324# define STAM_REL_U16_DEC(pCounter) \
325 do { --*(pCounter); } while (0)
326#else
327# define STAM_REL_U16_DEC(pCounter) do { } while (0)
328#endif
329/** @def STAM_U16_DEC
330 * Decrements a uint16_t sample by one.
331 *
332 * @param pCounter Pointer to the uint16_t variable to operate on.
333 */
334#ifdef VBOX_WITH_STATISTICS
335# define STAM_U16_DEC(pCounter) STAM_REL_U16_DEC(pCounter)
336#else
337# define STAM_U16_DEC(pCounter) do { } while (0)
338#endif
339
340
341/** @def STAM_REL_U16_INC
342 * Increments a uint16_t sample by a value.
343 *
344 * @param pCounter Pointer to the uint16_t variable to operate on.
345 * @param Addend The value to add.
346 */
347#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
348# define STAM_REL_U16_ADD(pCounter, Addend) \
349 do { *(pCounter) += (Addend); } while (0)
350#else
351# define STAM_REL_U16_ADD(pCounter, Addend) do { } while (0)
352#endif
353/** @def STAM_U16_INC
354 * Increments a uint16_t sample by a value.
355 *
356 * @param pCounter Pointer to the uint16_t variable to operate on.
357 * @param Addend The value to add.
358 */
359#ifdef VBOX_WITH_STATISTICS
360# define STAM_U16_ADD(pCounter, Addend) STAM_REL_U16_ADD(pCounter, Addend)
361#else
362# define STAM_U16_ADD(pCounter, Addend) do { } while (0)
363#endif
364
365
366/** @def STAM_REL_U32_INC
367 * Increments a uint32_t sample by one.
368 *
369 * @param pCounter Pointer to the uint32_t variable to operate on.
370 */
371#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
372# define STAM_REL_U32_INC(pCounter) \
373 do { ++*(pCounter); } while (0)
374#else
375# define STAM_REL_U32_INC(pCounter) do { } while (0)
376#endif
377/** @def STAM_U32_INC
378 * Increments a uint32_t sample by one.
379 *
380 * @param pCounter Pointer to the uint32_t variable to operate on.
381 */
382#ifdef VBOX_WITH_STATISTICS
383# define STAM_U32_INC(pCounter) STAM_REL_U32_INC(pCounter)
384#else
385# define STAM_U32_INC(pCounter) do { } while (0)
386#endif
387
388
389/** @def STAM_REL_U32_DEC
390 * Decrements a uint32_t sample by one.
391 *
392 * @param pCounter Pointer to the uint32_t variable to operate on.
393 */
394#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
395# define STAM_REL_U32_DEC(pCounter) \
396 do { --*(pCounter); } while (0)
397#else
398# define STAM_REL_U32_DEC(pCounter) do { } while (0)
399#endif
400/** @def STAM_U32_DEC
401 * Decrements a uint32_t sample by one.
402 *
403 * @param pCounter Pointer to the uint32_t variable to operate on.
404 */
405#ifdef VBOX_WITH_STATISTICS
406# define STAM_U32_DEC(pCounter) STAM_REL_U32_DEC(pCounter)
407#else
408# define STAM_U32_DEC(pCounter) do { } while (0)
409#endif
410
411
412/** @def STAM_REL_U32_ADD
413 * Increments a uint32_t sample by value.
414 *
415 * @param pCounter Pointer to the uint32_t variable to operate on.
416 * @param Addend The value to add.
417 */
418#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
419# define STAM_REL_U32_ADD(pCounter, Addend) \
420 do { *(pCounter) += (Addend); } while (0)
421#else
422# define STAM_REL_U32_ADD(pCounter, Addend) do { } while (0)
423#endif
424/** @def STAM_U32_ADD
425 * Increments a uint32_t sample by value.
426 *
427 * @param pCounter Pointer to the uint32_t variable to operate on.
428 * @param Addend The value to add.
429 */
430#ifdef VBOX_WITH_STATISTICS
431# define STAM_U32_ADD(pCounter, Addend) STAM_REL_U32_ADD(pCounter, Addend)
432#else
433# define STAM_U32_ADD(pCounter, Addend) do { } while (0)
434#endif
435
436
437/** @def STAM_REL_U64_INC
438 * Increments a uint64_t sample by one.
439 *
440 * @param pCounter Pointer to the uint64_t variable to operate on.
441 */
442#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
443# define STAM_REL_U64_INC(pCounter) \
444 do { ++*(pCounter); } while (0)
445#else
446# define STAM_REL_U64_INC(pCounter) do { } while (0)
447#endif
448/** @def STAM_U64_INC
449 * Increments a uint64_t sample by one.
450 *
451 * @param pCounter Pointer to the uint64_t variable to operate on.
452 */
453#ifdef VBOX_WITH_STATISTICS
454# define STAM_U64_INC(pCounter) STAM_REL_U64_INC(pCounter)
455#else
456# define STAM_U64_INC(pCounter) do { } while (0)
457#endif
458
459
460/** @def STAM_REL_U64_DEC
461 * Decrements a uint64_t sample by one.
462 *
463 * @param pCounter Pointer to the uint64_t variable to operate on.
464 */
465#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
466# define STAM_REL_U64_DEC(pCounter) \
467 do { --*(pCounter); } while (0)
468#else
469# define STAM_REL_U64_DEC(pCounter) do { } while (0)
470#endif
471/** @def STAM_U64_DEC
472 * Decrements a uint64_t sample by one.
473 *
474 * @param pCounter Pointer to the uint64_t variable to operate on.
475 */
476#ifdef VBOX_WITH_STATISTICS
477# define STAM_U64_DEC(pCounter) STAM_REL_U64_DEC(pCounter)
478#else
479# define STAM_U64_DEC(pCounter) do { } while (0)
480#endif
481
482
483/** @def STAM_REL_U64_ADD
484 * Increments a uint64_t sample by a value.
485 *
486 * @param pCounter Pointer to the uint64_t variable to operate on.
487 * @param Addend The value to add.
488 */
489#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
490# define STAM_REL_U64_ADD(pCounter, Addend) \
491 do { *(pCounter) += (Addend); } while (0)
492#else
493# define STAM_REL_U64_ADD(pCounter, Addend) do { } while (0)
494#endif
495/** @def STAM_U64_ADD
496 * Increments a uint64_t sample by a value.
497 *
498 * @param pCounter Pointer to the uint64_t variable to operate on.
499 * @param Addend The value to add.
500 */
501#ifdef VBOX_WITH_STATISTICS
502# define STAM_U64_ADD(pCounter, Addend) STAM_REL_U64_ADD(pCounter, Addend)
503#else
504# define STAM_U64_ADD(pCounter, Addend) do { } while (0)
505#endif
506
507
508/**
509 * Counter sample - STAMTYPE_COUNTER.
510 */
511typedef struct STAMCOUNTER
512{
513 /** The current count. */
514 volatile uint64_t c;
515} STAMCOUNTER;
516/** Pointer to a counter. */
517typedef STAMCOUNTER *PSTAMCOUNTER;
518/** Pointer to a const counter. */
519typedef const STAMCOUNTER *PCSTAMCOUNTER;
520
521
522/** @def STAM_REL_COUNTER_INC
523 * Increments a counter sample by one.
524 *
525 * @param pCounter Pointer to the STAMCOUNTER structure to operate on.
526 */
527#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
528# define STAM_REL_COUNTER_INC(pCounter) \
529 do { (pCounter)->c++; } while (0)
530#else
531# define STAM_REL_COUNTER_INC(pCounter) do { } while (0)
532#endif
533/** @def STAM_COUNTER_INC
534 * Increments a counter sample by one.
535 *
536 * @param pCounter Pointer to the STAMCOUNTER structure to operate on.
537 */
538#ifdef VBOX_WITH_STATISTICS
539# define STAM_COUNTER_INC(pCounter) STAM_REL_COUNTER_INC(pCounter)
540#else
541# define STAM_COUNTER_INC(pCounter) do { } while (0)
542#endif
543
544
545/** @def STAM_REL_COUNTER_DEC
546 * Decrements a counter sample by one.
547 *
548 * @param pCounter Pointer to the STAMCOUNTER structure to operate on.
549 */
550#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
551# define STAM_REL_COUNTER_DEC(pCounter) \
552 do { (pCounter)->c--; } while (0)
553#else
554# define STAM_REL_COUNTER_DEC(pCounter) do { } while (0)
555#endif
556/** @def STAM_COUNTER_DEC
557 * Decrements a counter sample by one.
558 *
559 * @param pCounter Pointer to the STAMCOUNTER structure to operate on.
560 */
561#ifdef VBOX_WITH_STATISTICS
562# define STAM_COUNTER_DEC(pCounter) STAM_REL_COUNTER_DEC(pCounter)
563#else
564# define STAM_COUNTER_DEC(pCounter) do { } while (0)
565#endif
566
567
568/** @def STAM_REL_COUNTER_ADD
569 * Increments a counter sample by a value.
570 *
571 * @param pCounter Pointer to the STAMCOUNTER structure to operate on.
572 * @param Addend The value to add to the counter.
573 */
574#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
575# define STAM_REL_COUNTER_ADD(pCounter, Addend) \
576 do { (pCounter)->c += (Addend); } while (0)
577#else
578# define STAM_REL_COUNTER_ADD(pCounter, Addend) do { } while (0)
579#endif
580/** @def STAM_COUNTER_ADD
581 * Increments a counter sample by a value.
582 *
583 * @param pCounter Pointer to the STAMCOUNTER structure to operate on.
584 * @param Addend The value to add to the counter.
585 */
586#ifdef VBOX_WITH_STATISTICS
587# define STAM_COUNTER_ADD(pCounter, Addend) STAM_REL_COUNTER_ADD(pCounter, Addend)
588#else
589# define STAM_COUNTER_ADD(pCounter, Addend) do { } while (0)
590#endif
591
592
593/** @def STAM_REL_COUNTER_RESET
594 * Resets the statistics sample.
595 */
596#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
597# define STAM_REL_COUNTER_RESET(pCounter) do { (pCounter)->c = 0; } while (0)
598#else
599# define STAM_REL_COUNTER_RESET(pCounter) do { } while (0)
600#endif
601/** @def STAM_COUNTER_RESET
602 * Resets the statistics sample.
603 */
604#ifdef VBOX_WITH_STATISTICS
605# define STAM_COUNTER_RESET(pCounter) STAM_REL_COUNTER_RESET(pCounter)
606#else
607# define STAM_COUNTER_RESET(pCounter) do { } while (0)
608#endif
609
610
611
612/**
613 * Profiling sample - STAMTYPE_PROFILE.
614 */
615typedef struct STAMPROFILE
616{
617 /** Number of periods. */
618 volatile uint64_t cPeriods;
619 /** Total count of ticks. */
620 volatile uint64_t cTicks;
621 /** Maximum tick count during a sampling. */
622 volatile uint64_t cTicksMax;
623 /** Minimum tick count during a sampling. */
624 volatile uint64_t cTicksMin;
625} STAMPROFILE;
626/** Pointer to a profile sample. */
627typedef STAMPROFILE *PSTAMPROFILE;
628/** Pointer to a const profile sample. */
629typedef const STAMPROFILE *PCSTAMPROFILE;
630
631
632/** @def STAM_REL_PROFILE_ADD_PERIOD
633 * Adds a period.
634 *
635 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
636 * @param cTicksInPeriod The number of tick (or whatever) of the preiod
637 * being added. This is only referenced once.
638 */
639#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
640# define STAM_REL_PROFILE_ADD_PERIOD(pProfile, cTicksInPeriod) \
641 do { \
642 uint64_t const StamPrefix_cTicks = (cTicksInPeriod); \
643 (pProfile)->cTicks += StamPrefix_cTicks; \
644 (pProfile)->cPeriods++; \
645 if ((pProfile)->cTicksMax < StamPrefix_cTicks) \
646 (pProfile)->cTicksMax = StamPrefix_cTicks; \
647 if ((pProfile)->cTicksMin > StamPrefix_cTicks) \
648 (pProfile)->cTicksMin = StamPrefix_cTicks; \
649 } while (0)
650#else
651# define STAM_REL_PROFILE_ADD_PERIOD(pProfile, cTicksInPeriod) do { } while (0)
652#endif
653/** @def STAM_PROFILE_ADD_PERIOD
654 * Adds a period.
655 *
656 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
657 * @param cTicksInPeriod The number of tick (or whatever) of the preiod
658 * being added. This is only referenced once.
659 */
660#ifdef VBOX_WITH_STATISTICS
661# define STAM_PROFILE_ADD_PERIOD(pProfile, cTicksInPeriod) STAM_REL_PROFILE_ADD_PERIOD(pProfile, cTicksInPeriod)
662#else
663# define STAM_PROFILE_ADD_PERIOD(pProfile, cTicksInPeriod) do { } while (0)
664#endif
665
666
667/** @def STAM_REL_PROFILE_START
668 * Samples the start time of a profiling period.
669 *
670 * @param pProfile Pointer to the STAMPROFILE structure to operate on.
671 * @param Prefix Identifier prefix used to internal variables.
672 *
673 * @remarks Declears a stack variable that will be used by related macros.
674 */
675#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
676# define STAM_REL_PROFILE_START(pProfile, Prefix) \
677 uint64_t Prefix##_tsStart; \
678 STAM_GET_TS(Prefix##_tsStart)
679#else
680# define STAM_REL_PROFILE_START(pProfile, Prefix) do { } while (0)
681#endif
682/** @def STAM_PROFILE_START
683 * Samples the start time of a profiling period.
684 *
685 * @param pProfile Pointer to the STAMPROFILE structure to operate on.
686 * @param Prefix Identifier prefix used to internal variables.
687 *
688 * @remarks Declears a stack variable that will be used by related macros.
689 */
690#ifdef VBOX_WITH_STATISTICS
691# define STAM_PROFILE_START(pProfile, Prefix) STAM_REL_PROFILE_START(pProfile, Prefix)
692#else
693# define STAM_PROFILE_START(pProfile, Prefix) do { } while (0)
694#endif
695
696/** @def STAM_REL_PROFILE_STOP
697 * Samples the stop time of a profiling period and updates the sample.
698 *
699 * @param pProfile Pointer to the STAMPROFILE structure to operate on.
700 * @param Prefix Identifier prefix used to internal variables.
701 */
702#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
703# define STAM_REL_PROFILE_STOP(pProfile, Prefix) \
704 do { \
705 uint64_t Prefix##_cTicks; \
706 STAM_GET_TS(Prefix##_cTicks); \
707 Prefix##_cTicks -= Prefix##_tsStart; \
708 (pProfile)->cTicks += Prefix##_cTicks; \
709 (pProfile)->cPeriods++; \
710 if ((pProfile)->cTicksMax < Prefix##_cTicks) \
711 (pProfile)->cTicksMax = Prefix##_cTicks; \
712 if ((pProfile)->cTicksMin > Prefix##_cTicks) \
713 (pProfile)->cTicksMin = Prefix##_cTicks; \
714 } while (0)
715#else
716# define STAM_REL_PROFILE_STOP(pProfile, Prefix) do { } while (0)
717#endif
718/** @def STAM_PROFILE_STOP
719 * Samples the stop time of a profiling period and updates the sample.
720 *
721 * @param pProfile Pointer to the STAMPROFILE structure to operate on.
722 * @param Prefix Identifier prefix used to internal variables.
723 */
724#ifdef VBOX_WITH_STATISTICS
725# define STAM_PROFILE_STOP(pProfile, Prefix) STAM_REL_PROFILE_STOP(pProfile, Prefix)
726#else
727# define STAM_PROFILE_STOP(pProfile, Prefix) do { } while (0)
728#endif
729
730
731/** @def STAM_REL_PROFILE_STOP_EX
732 * Samples the stop time of a profiling period and updates both the sample
733 * and an attribution sample.
734 *
735 * @param pProfile Pointer to the STAMPROFILE structure to operate on.
736 * @param pProfile2 Pointer to the STAMPROFILE structure which this
737 * interval should be attributed to as well. This may be NULL.
738 * @param Prefix Identifier prefix used to internal variables.
739 */
740#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
741# define STAM_REL_PROFILE_STOP_EX(pProfile, pProfile2, Prefix) \
742 do { \
743 uint64_t Prefix##_cTicks; \
744 STAM_GET_TS(Prefix##_cTicks); \
745 Prefix##_cTicks -= Prefix##_tsStart; \
746 (pProfile)->cTicks += Prefix##_cTicks; \
747 (pProfile)->cPeriods++; \
748 if ((pProfile)->cTicksMax < Prefix##_cTicks) \
749 (pProfile)->cTicksMax = Prefix##_cTicks; \
750 if ((pProfile)->cTicksMin > Prefix##_cTicks) \
751 (pProfile)->cTicksMin = Prefix##_cTicks; \
752 \
753 if ((pProfile2)) \
754 { \
755 (pProfile2)->cTicks += Prefix##_cTicks; \
756 (pProfile2)->cPeriods++; \
757 if ((pProfile2)->cTicksMax < Prefix##_cTicks) \
758 (pProfile2)->cTicksMax = Prefix##_cTicks; \
759 if ((pProfile2)->cTicksMin > Prefix##_cTicks) \
760 (pProfile2)->cTicksMin = Prefix##_cTicks; \
761 } \
762 } while (0)
763#else
764# define STAM_REL_PROFILE_STOP_EX(pProfile, pProfile2, Prefix) do { } while (0)
765#endif
766/** @def STAM_PROFILE_STOP_EX
767 * Samples the stop time of a profiling period and updates both the sample
768 * and an attribution sample.
769 *
770 * @param pProfile Pointer to the STAMPROFILE structure to operate on.
771 * @param pProfile2 Pointer to the STAMPROFILE structure which this
772 * interval should be attributed to as well. This may be NULL.
773 * @param Prefix Identifier prefix used to internal variables.
774 */
775#ifdef VBOX_WITH_STATISTICS
776# define STAM_PROFILE_STOP_EX(pProfile, pProfile2, Prefix) STAM_REL_PROFILE_STOP_EX(pProfile, pProfile2, Prefix)
777#else
778# define STAM_PROFILE_STOP_EX(pProfile, pProfile2, Prefix) do { } while (0)
779#endif
780
781
782/**
783 * Advanced profiling sample - STAMTYPE_PROFILE_ADV.
784 *
785 * Identical to a STAMPROFILE sample, but the start timestamp
786 * is stored after the STAMPROFILE structure so the sampling
787 * can start and stop in different functions.
788 */
789typedef struct STAMPROFILEADV
790{
791 /** The STAMPROFILE core. */
792 STAMPROFILE Core;
793 /** The start timestamp. */
794 volatile uint64_t tsStart;
795} STAMPROFILEADV;
796/** Pointer to a advanced profile sample. */
797typedef STAMPROFILEADV *PSTAMPROFILEADV;
798/** Pointer to a const advanced profile sample. */
799typedef const STAMPROFILEADV *PCSTAMPROFILEADV;
800
801
802/** @def STAM_REL_PROFILE_ADV_START
803 * Samples the start time of a profiling period.
804 *
805 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
806 * @param Prefix Identifier prefix used to internal variables.
807 */
808#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
809# define STAM_REL_PROFILE_ADV_START(pProfileAdv, Prefix) \
810 STAM_GET_TS((pProfileAdv)->tsStart)
811#else
812# define STAM_REL_PROFILE_ADV_START(pProfileAdv, Prefix) do { } while (0)
813#endif
814/** @def STAM_PROFILE_ADV_START
815 * Samples the start time of a profiling period.
816 *
817 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
818 * @param Prefix Identifier prefix used to internal variables.
819 */
820#ifdef VBOX_WITH_STATISTICS
821# define STAM_PROFILE_ADV_START(pProfileAdv, Prefix) STAM_REL_PROFILE_ADV_START(pProfileAdv, Prefix)
822#else
823# define STAM_PROFILE_ADV_START(pProfileAdv, Prefix) do { } while (0)
824#endif
825
826
827/** @def STAM_REL_PROFILE_ADV_STOP
828 * Samples the stop time of a profiling period (if running) and updates the
829 * sample.
830 *
831 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
832 * @param Prefix Identifier prefix used to internal variables.
833 */
834#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
835# define STAM_REL_PROFILE_ADV_STOP(pProfileAdv, Prefix) \
836 do { \
837 if ((pProfileAdv)->tsStart) \
838 { \
839 uint64_t Prefix##_cTicks; \
840 STAM_GET_TS(Prefix##_cTicks); \
841 Prefix##_cTicks -= (pProfileAdv)->tsStart; \
842 (pProfileAdv)->tsStart = 0; \
843 (pProfileAdv)->Core.cTicks += Prefix##_cTicks; \
844 (pProfileAdv)->Core.cPeriods++; \
845 if ((pProfileAdv)->Core.cTicksMax < Prefix##_cTicks) \
846 (pProfileAdv)->Core.cTicksMax = Prefix##_cTicks; \
847 if ((pProfileAdv)->Core.cTicksMin > Prefix##_cTicks) \
848 (pProfileAdv)->Core.cTicksMin = Prefix##_cTicks; \
849 } \
850 } while (0)
851#else
852# define STAM_REL_PROFILE_ADV_STOP(pProfileAdv, Prefix) do { } while (0)
853#endif
854/** @def STAM_PROFILE_ADV_STOP
855 * Samples the stop time of a profiling period (if running) and updates the
856 * sample.
857 *
858 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
859 * @param Prefix Identifier prefix used to internal variables.
860 */
861#ifdef VBOX_WITH_STATISTICS
862# define STAM_PROFILE_ADV_STOP(pProfileAdv, Prefix) STAM_REL_PROFILE_ADV_STOP(pProfileAdv, Prefix)
863#else
864# define STAM_PROFILE_ADV_STOP(pProfileAdv, Prefix) do { } while (0)
865#endif
866
867
868/** @def STAM_REL_PROFILE_ADV_STOP_START
869 * Stops one profile counter (if running) and starts another one.
870 *
871 * @param pProfileAdv1 Pointer to the STAMPROFILEADV structure to stop.
872 * @param pProfileAdv2 Pointer to the STAMPROFILEADV structure to start.
873 * @param Prefix Identifier prefix used to internal variables.
874 */
875#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
876# define STAM_REL_PROFILE_ADV_STOP_START(pProfileAdv1, pProfileAdv2, Prefix) \
877 do { \
878 uint64_t Prefix##_cTicks; \
879 STAM_GET_TS(Prefix##_cTicks); \
880 (pProfileAdv2)->tsStart = Prefix##_cTicks; \
881 if ((pProfileAdv1)->tsStart) \
882 { \
883 Prefix##_cTicks -= (pProfileAdv1)->tsStart; \
884 (pProfileAdv1)->tsStart = 0; \
885 (pProfileAdv1)->Core.cTicks += Prefix##_cTicks; \
886 (pProfileAdv1)->Core.cPeriods++; \
887 if ((pProfileAdv1)->Core.cTicksMax < Prefix##_cTicks) \
888 (pProfileAdv1)->Core.cTicksMax = Prefix##_cTicks; \
889 if ((pProfileAdv1)->Core.cTicksMin > Prefix##_cTicks) \
890 (pProfileAdv1)->Core.cTicksMin = Prefix##_cTicks; \
891 } \
892 } while (0)
893#else
894# define STAM_REL_PROFILE_ADV_STOP_START(pProfileAdv1, pProfileAdv2, Prefix) \
895 do { } while (0)
896#endif
897/** @def STAM_PROFILE_ADV_STOP_START
898 * Samples the stop time of a profiling period (if running) and updates the
899 * sample.
900 *
901 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
902 * @param Prefix Identifier prefix used to internal variables.
903 */
904#ifdef VBOX_WITH_STATISTICS
905# define STAM_PROFILE_ADV_STOP_START(pProfileAdv1, pProfileAdv2, Prefix) \
906 STAM_REL_PROFILE_ADV_STOP_START(pProfileAdv1, pProfileAdv2, Prefix)
907#else
908# define STAM_PROFILE_ADV_STOP_START(pProfileAdv1, pProfileAdv2, Prefix) \
909 do { } while (0)
910#endif
911
912
913/** @def STAM_REL_PROFILE_ADV_SUSPEND
914 * Suspends the sampling for a while. This can be useful to exclude parts
915 * covered by other samples without screwing up the count, and average+min times.
916 *
917 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
918 * @param Prefix Identifier prefix used to internal variables. The prefix
919 * must match that of the resume one since it stores the
920 * suspend time in a stack variable.
921 */
922#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
923# define STAM_REL_PROFILE_ADV_SUSPEND(pProfileAdv, Prefix) \
924 uint64_t Prefix##_tsSuspend; \
925 STAM_GET_TS(Prefix##_tsSuspend)
926#else
927# define STAM_REL_PROFILE_ADV_SUSPEND(pProfileAdv, Prefix) do { } while (0)
928#endif
929/** @def STAM_PROFILE_ADV_SUSPEND
930 * Suspends the sampling for a while. This can be useful to exclude parts
931 * covered by other samples without screwing up the count, and average+min times.
932 *
933 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
934 * @param Prefix Identifier prefix used to internal variables. The prefix
935 * must match that of the resume one since it stores the
936 * suspend time in a stack variable.
937 */
938#ifdef VBOX_WITH_STATISTICS
939# define STAM_PROFILE_ADV_SUSPEND(pProfileAdv, Prefix) STAM_REL_PROFILE_ADV_SUSPEND(pProfileAdv, Prefix)
940#else
941# define STAM_PROFILE_ADV_SUSPEND(pProfileAdv, Prefix) do { } while (0)
942#endif
943
944
945/** @def STAM_REL_PROFILE_ADV_RESUME
946 * Counter to STAM_REL_PROFILE_ADV_SUSPEND.
947 *
948 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
949 * @param Prefix Identifier prefix used to internal variables. This must
950 * match the one used with the SUSPEND!
951 */
952#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
953# define STAM_REL_PROFILE_ADV_RESUME(pProfileAdv, Prefix) \
954 do { \
955 uint64_t Prefix##_tsNow; \
956 STAM_GET_TS(Prefix##_tsNow); \
957 (pProfileAdv)->tsStart += Prefix##_tsNow - Prefix##_tsSuspend; \
958 } while (0)
959#else
960# define STAM_REL_PROFILE_ADV_RESUME(pProfileAdv, Prefix) do { } while (0)
961#endif
962/** @def STAM_PROFILE_ADV_RESUME
963 * Counter to STAM_PROFILE_ADV_SUSPEND.
964 *
965 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
966 * @param Prefix Identifier prefix used to internal variables. This must
967 * match the one used with the SUSPEND!
968 */
969#ifdef VBOX_WITH_STATISTICS
970# define STAM_PROFILE_ADV_RESUME(pProfileAdv, Prefix) STAM_REL_PROFILE_ADV_RESUME(pProfileAdv, Prefix)
971#else
972# define STAM_PROFILE_ADV_RESUME(pProfileAdv, Prefix) do { } while (0)
973#endif
974
975
976/** @def STAM_REL_PROFILE_ADV_STOP_EX
977 * Samples the stop time of a profiling period (if running) and updates both
978 * the sample and an attribution sample.
979 *
980 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
981 * @param pProfile2 Pointer to the STAMPROFILE structure which this
982 * interval should be attributed to as well. This may be NULL.
983 * @param Prefix Identifier prefix used to internal variables.
984 */
985#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
986# define STAM_REL_PROFILE_ADV_STOP_EX(pProfileAdv, pProfile2, Prefix) \
987 do { \
988 if ((pProfileAdv)->tsStart) \
989 { \
990 uint64_t Prefix##_cTicks; \
991 STAM_GET_TS(Prefix##_cTicks); \
992 Prefix##_cTicks -= (pProfileAdv)->tsStart; \
993 (pProfileAdv)->tsStart = 0; \
994 (pProfileAdv)->Core.cTicks += Prefix##_cTicks; \
995 (pProfileAdv)->Core.cPeriods++; \
996 if ((pProfileAdv)->Core.cTicksMax < Prefix##_cTicks) \
997 (pProfileAdv)->Core.cTicksMax = Prefix##_cTicks; \
998 if ((pProfileAdv)->Core.cTicksMin > Prefix##_cTicks) \
999 (pProfileAdv)->Core.cTicksMin = Prefix##_cTicks; \
1000 if ((pProfile2)) \
1001 { \
1002 (pProfile2)->cTicks += Prefix##_cTicks; \
1003 (pProfile2)->cPeriods++; \
1004 if ((pProfile2)->cTicksMax < Prefix##_cTicks) \
1005 (pProfile2)->cTicksMax = Prefix##_cTicks; \
1006 if ((pProfile2)->cTicksMin > Prefix##_cTicks) \
1007 (pProfile2)->cTicksMin = Prefix##_cTicks; \
1008 } \
1009 } \
1010 } while (0)
1011#else
1012# define STAM_REL_PROFILE_ADV_STOP_EX(pProfileAdv, pProfile2, Prefix) do { } while (0)
1013#endif
1014/** @def STAM_PROFILE_ADV_STOP_EX
1015 * Samples the stop time of a profiling period (if running) and updates both
1016 * the sample and an attribution sample.
1017 *
1018 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
1019 * @param pProfile2 Pointer to the STAMPROFILE structure which this
1020 * interval should be attributed to as well. This may be NULL.
1021 * @param Prefix Identifier prefix used to internal variables.
1022 */
1023#ifdef VBOX_WITH_STATISTICS
1024# define STAM_PROFILE_ADV_STOP_EX(pProfileAdv, pProfile2, Prefix) STAM_REL_PROFILE_ADV_STOP_EX(pProfileAdv, pProfile2, Prefix)
1025#else
1026# define STAM_PROFILE_ADV_STOP_EX(pProfileAdv, pProfile2, Prefix) do { } while (0)
1027#endif
1028
1029/** @def STAM_REL_PROFILE_ADV_IS_RUNNING
1030 * Checks if it is running.
1031 *
1032 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
1033 */
1034#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
1035# define STAM_REL_PROFILE_ADV_IS_RUNNING(pProfileAdv) (pProfileAdv)->tsStart
1036#else
1037# define STAM_REL_PROFILE_ADV_IS_RUNNING(pProfileAdv) (false)
1038#endif
1039/** @def STAM_PROFILE_ADV_IS_RUNNING
1040 * Checks if it is running.
1041 *
1042 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
1043 */
1044#ifdef VBOX_WITH_STATISTICS
1045# define STAM_PROFILE_ADV_IS_RUNNING(pProfileAdv) STAM_REL_PROFILE_ADV_IS_RUNNING(pProfileAdv)
1046#else
1047# define STAM_PROFILE_ADV_IS_RUNNING(pProfileAdv) (false)
1048#endif
1049
1050/** @def STAM_REL_PROFILE_ADV_SET_STOPPED
1051 * Marks the profile counter as stopped.
1052 *
1053 * This is for avoiding screwups in twisty code.
1054 *
1055 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
1056 */
1057#ifndef VBOX_WITHOUT_RELEASE_STATISTICS
1058# define STAM_REL_PROFILE_ADV_SET_STOPPED(pProfileAdv) do { (pProfileAdv)->tsStart = 0; } while (0)
1059#else
1060# define STAM_REL_PROFILE_ADV_SET_STOPPED(pProfileAdv) do { } while (0)
1061#endif
1062/** @def STAM_PROFILE_ADV_SET_STOPPED
1063 * Marks the profile counter as stopped.
1064 *
1065 * This is for avoiding screwups in twisty code.
1066 *
1067 * @param pProfileAdv Pointer to the STAMPROFILEADV structure to operate on.
1068 */
1069#ifdef VBOX_WITH_STATISTICS
1070# define STAM_PROFILE_ADV_SET_STOPPED(pProfileAdv) STAM_REL_PROFILE_ADV_SET_STOPPED(pProfileAdv)
1071#else
1072# define STAM_PROFILE_ADV_SET_STOPPED(pProfileAdv) do { } while (0)
1073#endif
1074
1075
1076/**
1077 * Ratio of A to B, uint32_t types.
1078 * @remark Use STAM_STATS or STAM_REL_STATS for modifying A & B values.
1079 */
1080typedef struct STAMRATIOU32
1081{
1082 /** Sample A. */
1083 uint32_t volatile u32A;
1084 /** Sample B. */
1085 uint32_t volatile u32B;
1086} STAMRATIOU32;
1087/** Pointer to a uint32_t ratio. */
1088typedef STAMRATIOU32 *PSTAMRATIOU32;
1089/** Pointer to const a uint32_t ratio. */
1090typedef const STAMRATIOU32 *PCSTAMRATIOU32;
1091
1092
1093
1094
1095/** @defgroup grp_stam_r3 The STAM Host Context Ring 3 API
1096 * @ingroup grp_stam
1097 * @{
1098 */
1099
1100VMMR3DECL(int) STAMR3InitUVM(PUVM pUVM);
1101VMMR3DECL(void) STAMR3TermUVM(PUVM pUVM);
1102VMMR3DECL(int) STAMR3RegisterU(PUVM pUVM, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility,
1103 const char *pszName, STAMUNIT enmUnit, const char *pszDesc);
1104VMMR3DECL(int) STAMR3Register(PVM pVM, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility,
1105 const char *pszName, STAMUNIT enmUnit, const char *pszDesc);
1106
1107/** @def STAM_REL_REG
1108 * Registers a statistics sample.
1109 *
1110 * @param pVM VM Handle.
1111 * @param pvSample Pointer to the sample.
1112 * @param enmType Sample type. This indicates what pvSample is pointing at.
1113 * @param pszName Sample name. The name is on this form "/<component>/<sample>".
1114 * Further nesting is possible.
1115 * @param enmUnit Sample unit.
1116 * @param pszDesc Sample description.
1117 */
1118#define STAM_REL_REG(pVM, pvSample, enmType, pszName, enmUnit, pszDesc) \
1119 STAM_REL_STATS({ int rcStam = STAMR3Register(pVM, pvSample, enmType, STAMVISIBILITY_ALWAYS, pszName, enmUnit, pszDesc); \
1120 AssertRC(rcStam); })
1121/** @def STAM_REG
1122 * Registers a statistics sample if statistics are enabled.
1123 *
1124 * @param pVM VM Handle.
1125 * @param pvSample Pointer to the sample.
1126 * @param enmType Sample type. This indicates what pvSample is pointing at.
1127 * @param pszName Sample name. The name is on this form "/<component>/<sample>".
1128 * Further nesting is possible.
1129 * @param enmUnit Sample unit.
1130 * @param pszDesc Sample description.
1131 */
1132#define STAM_REG(pVM, pvSample, enmType, pszName, enmUnit, pszDesc) \
1133 STAM_STATS({STAM_REL_REG(pVM, pvSample, enmType, pszName, enmUnit, pszDesc);})
1134
1135/** @def STAM_REL_REG_USED
1136 * Registers a statistics sample which only shows when used.
1137 *
1138 * @param pVM VM Handle.
1139 * @param pvSample Pointer to the sample.
1140 * @param enmType Sample type. This indicates what pvSample is pointing at.
1141 * @param pszName Sample name. The name is on this form "/<component>/<sample>".
1142 * Further nesting is possible.
1143 * @param enmUnit Sample unit.
1144 * @param pszDesc Sample description.
1145 */
1146#define STAM_REL_REG_USED(pVM, pvSample, enmType, pszName, enmUnit, pszDesc) \
1147 STAM_REL_STATS({ int rcStam = STAMR3Register(pVM, pvSample, enmType, STAMVISIBILITY_USED, pszName, enmUnit, pszDesc); \
1148 AssertRC(rcStam);})
1149/** @def STAM_REG_USED
1150 * Registers a statistics sample which only shows when used, if statistics are enabled.
1151 *
1152 * @param pVM VM Handle.
1153 * @param pvSample Pointer to the sample.
1154 * @param enmType Sample type. This indicates what pvSample is pointing at.
1155 * @param pszName Sample name. The name is on this form "/<component>/<sample>".
1156 * Further nesting is possible.
1157 * @param enmUnit Sample unit.
1158 * @param pszDesc Sample description.
1159 */
1160#define STAM_REG_USED(pVM, pvSample, enmType, pszName, enmUnit, pszDesc) \
1161 STAM_STATS({ STAM_REL_REG_USED(pVM, pvSample, enmType, pszName, enmUnit, pszDesc); })
1162
1163VMMR3DECL(int) STAMR3RegisterFU(PUVM pUVM, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility, STAMUNIT enmUnit,
1164 const char *pszDesc, const char *pszName, ...);
1165VMMR3DECL(int) STAMR3RegisterF(PVM pVM, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility, STAMUNIT enmUnit,
1166 const char *pszDesc, const char *pszName, ...);
1167VMMR3DECL(int) STAMR3RegisterVU(PUVM pUVM, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility, STAMUNIT enmUnit,
1168 const char *pszDesc, const char *pszName, va_list args);
1169VMMR3DECL(int) STAMR3RegisterV(PVM pVM, void *pvSample, STAMTYPE enmType, STAMVISIBILITY enmVisibility, STAMUNIT enmUnit,
1170 const char *pszDesc, const char *pszName, va_list args);
1171
1172/**
1173 * Resets the sample.
1174 * @param pVM The VM handle.
1175 * @param pvSample The sample registered using STAMR3RegisterCallback.
1176 */
1177typedef void FNSTAMR3CALLBACKRESET(PVM pVM, void *pvSample);
1178/** Pointer to a STAM sample reset callback. */
1179typedef FNSTAMR3CALLBACKRESET *PFNSTAMR3CALLBACKRESET;
1180
1181/**
1182 * Prints the sample into the buffer.
1183 *
1184 * @param pVM The VM handle.
1185 * @param pvSample The sample registered using STAMR3RegisterCallback.
1186 * @param pszBuf The buffer to print into.
1187 * @param cchBuf The size of the buffer.
1188 */
1189typedef void FNSTAMR3CALLBACKPRINT(PVM pVM, void *pvSample, char *pszBuf, size_t cchBuf);
1190/** Pointer to a STAM sample print callback. */
1191typedef FNSTAMR3CALLBACKPRINT *PFNSTAMR3CALLBACKPRINT;
1192
1193VMMR3DECL(int) STAMR3RegisterCallback(PVM pVM, void *pvSample, STAMVISIBILITY enmVisibility, STAMUNIT enmUnit,
1194 PFNSTAMR3CALLBACKRESET pfnReset, PFNSTAMR3CALLBACKPRINT pfnPrint,
1195 const char *pszDesc, const char *pszName, ...);
1196VMMR3DECL(int) STAMR3RegisterCallbackV(PVM pVM, void *pvSample, STAMVISIBILITY enmVisibility, STAMUNIT enmUnit,
1197 PFNSTAMR3CALLBACKRESET pfnReset, PFNSTAMR3CALLBACKPRINT pfnPrint,
1198 const char *pszDesc, const char *pszName, va_list args);
1199VMMR3DECL(int) STAMR3DeregisterU(PUVM pUVM, void *pvSample);
1200VMMR3DECL(int) STAMR3Deregister(PVM pVM, void *pvSample);
1201
1202/** @def STAM_REL_DEREG
1203 * Deregisters a statistics sample if statistics are enabled.
1204 *
1205 * @param pVM VM Handle.
1206 * @param pvSample Pointer to the sample.
1207 */
1208#define STAM_REL_DEREG(pVM, pvSample) \
1209 STAM_REL_STATS({ int rcStam = STAMR3Deregister(pVM, pvSample); AssertRC(rcStam); })
1210/** @def STAM_DEREG
1211 * Deregisters a statistics sample if statistics are enabled.
1212 *
1213 * @param pVM VM Handle.
1214 * @param pvSample Pointer to the sample.
1215 */
1216#define STAM_DEREG(pVM, pvSample) \
1217 STAM_STATS({ STAM_REL_DEREG(pVM, pvSample); })
1218
1219VMMR3DECL(int) STAMR3ResetU(PUVM pUVM, const char *pszPat);
1220VMMR3DECL(int) STAMR3Reset(PVM pVM, const char *pszPat);
1221VMMR3DECL(int) STAMR3SnapshotU(PUVM pUVM, const char *pszPat, char **ppszSnapshot, size_t *pcchSnapshot, bool fWithDesc);
1222VMMR3DECL(int) STAMR3Snapshot(PVM pVM, const char *pszPat, char **ppszSnapshot, size_t *pcchSnapshot, bool fWithDesc);
1223VMMR3DECL(int) STAMR3SnapshotFreeU(PUVM pUVM, char *pszSnapshot);
1224VMMR3DECL(int) STAMR3SnapshotFree(PVM pVM, char *pszSnapshot);
1225VMMR3DECL(int) STAMR3DumpU(PUVM pUVM, const char *pszPat);
1226VMMR3DECL(int) STAMR3Dump(PVM pVM, const char *pszPat);
1227VMMR3DECL(int) STAMR3DumpToReleaseLogU(PUVM pUVM, const char *pszPat);
1228VMMR3DECL(int) STAMR3DumpToReleaseLog(PVM pVM, const char *pszPat);
1229VMMR3DECL(int) STAMR3PrintU(PUVM pUVM, const char *pszPat);
1230VMMR3DECL(int) STAMR3Print(PVM pVM, const char *pszPat);
1231
1232/**
1233 * Callback function for STAMR3Enum().
1234 *
1235 * @returns non-zero to halt the enumeration.
1236 *
1237 * @param pszName The name of the sample.
1238 * @param enmType The type.
1239 * @param pvSample Pointer to the data. enmType indicates the format of this data.
1240 * @param enmUnit The unit.
1241 * @param enmVisibility The visibility.
1242 * @param pszDesc The description.
1243 * @param pvUser The pvUser argument given to STAMR3Enum().
1244 */
1245typedef DECLCALLBACK(int) FNSTAMR3ENUM(const char *pszName, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit,
1246 STAMVISIBILITY enmVisiblity, const char *pszDesc, void *pvUser);
1247/** Pointer to a FNSTAMR3ENUM(). */
1248typedef FNSTAMR3ENUM *PFNSTAMR3ENUM;
1249
1250VMMR3DECL(int) STAMR3EnumU(PUVM pUVM, const char *pszPat, PFNSTAMR3ENUM pfnEnum, void *pvUser);
1251VMMR3DECL(int) STAMR3Enum(PVM pVM, const char *pszPat, PFNSTAMR3ENUM pfnEnum, void *pvUser);
1252VMMR3DECL(const char *) STAMR3GetUnit(STAMUNIT enmUnit);
1253
1254/** @} */
1255
1256/** @} */
1257
1258RT_C_DECLS_END
1259
1260#endif
1261
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette