3 #include "mono-counters.h"
5 typedef struct _MonoCounter MonoCounter;
14 static MonoCounter *counters = NULL;
15 static int valid_mask = 0;
18 mono_counters_enable (int section_mask)
20 valid_mask = section_mask & MONO_COUNTER_SECTION_MASK;
24 mono_counters_register (const char* name, int type, void *addr)
27 if (!(type & valid_mask))
29 counter = malloc (sizeof (MonoCounter));
39 MonoCounter *item = counters;
48 typedef int (*IntFunc) (void);
49 typedef guint (*UIntFunc) (void);
50 typedef gint64 (*LongFunc) (void);
51 typedef guint64 (*ULongFunc) (void);
52 typedef gssize (*PtrFunc) (void);
53 typedef double (*DoubleFunc) (void);
54 typedef char* (*StrFunc) (void);
56 #define ENTRY_FMT "%-24s : "
58 dump_counter (MonoCounter *counter, FILE *outfile) {
66 switch (counter->type & MONO_COUNTER_TYPE_MASK) {
67 case MONO_COUNTER_INT:
68 if (counter->type & MONO_COUNTER_CALLBACK)
69 intval = ((IntFunc)counter->addr) ();
71 intval = *(int*)counter->addr;
72 fprintf (outfile, ENTRY_FMT "%d\n", counter->name, intval);
74 case MONO_COUNTER_UINT:
75 if (counter->type & MONO_COUNTER_CALLBACK)
76 uintval = ((UIntFunc)counter->addr) ();
78 uintval = *(guint*)counter->addr;
79 fprintf (outfile, ENTRY_FMT "%u\n", counter->name, uintval);
81 case MONO_COUNTER_LONG:
82 if (counter->type & MONO_COUNTER_CALLBACK)
83 int64val = ((LongFunc)counter->addr) ();
85 int64val = *(gint64*)counter->addr;
86 fprintf (outfile, ENTRY_FMT "%lld\n", counter->name, int64val);
88 case MONO_COUNTER_ULONG:
89 if (counter->type & MONO_COUNTER_CALLBACK)
90 uint64val = ((ULongFunc)counter->addr) ();
92 uint64val = *(guint64*)counter->addr;
93 fprintf (outfile, ENTRY_FMT "%llu\n", counter->name, uint64val);
95 case MONO_COUNTER_WORD:
96 if (counter->type & MONO_COUNTER_CALLBACK)
97 wordval = ((PtrFunc)counter->addr) ();
99 wordval = *(gssize*)counter->addr;
100 #if SIZEOF_VOID_P == 8
101 fprintf (outfile, ENTRY_FMT "%lld\n", counter->name, (gint64)wordval);
103 fprintf (outfile, ENTRY_FMT "%d\n", counter->name, wordval);
106 case MONO_COUNTER_DOUBLE:
107 if (counter->type & MONO_COUNTER_CALLBACK)
108 dval = ((DoubleFunc)counter->addr) ();
110 dval = *(double*)counter->addr;
111 fprintf (outfile, ENTRY_FMT "%.2f\n", counter->name, dval);
113 case MONO_COUNTER_STRING:
114 if (counter->type & MONO_COUNTER_CALLBACK)
115 str = ((StrFunc)counter->addr) ();
117 str = *(char**)counter->addr;
118 fprintf (outfile, ENTRY_FMT "%s\n", counter->name, str);
124 section_names [][10] = {
133 mono_counters_dump_section (int section, FILE *outfile)
135 MonoCounter *counter = counters;
137 if (counter->type & section)
138 dump_counter (counter, outfile);
139 counter = counter->next;
144 mono_counters_dump (int section_mask, FILE *outfile)
147 section_mask &= valid_mask;
150 for (j = 0, i = MONO_COUNTER_JIT; i < MONO_COUNTER_LAST_SECTION; j++, i <<= 1) {
151 if (section_mask & i) {
152 fprintf (outfile, "\n%s statistics\n", section_names [j]);
153 mono_counters_dump_section (i, outfile);