82f3fb45532ea46d79e2a4ce9fc5070a2ab4e962
[mono.git] / mono / utils / mono-counters.h
1 #ifndef __MONO_COUNTERS_H__
2 #define __MONO_COUNTERS_H__
3
4 #include <stdio.h>
5 #include <mono/utils/mono-publib.h>
6
7 enum {
8         /* Counter type, bits 0-7. */
9         MONO_COUNTER_INT,    /* 32 bit int */
10         MONO_COUNTER_UINT,    /* 32 bit uint */
11         MONO_COUNTER_WORD,   /* pointer-sized int */
12         MONO_COUNTER_LONG,   /* 64 bit int */
13         MONO_COUNTER_ULONG,   /* 64 bit uint */
14         MONO_COUNTER_DOUBLE,
15         MONO_COUNTER_STRING, /* char* */
16         MONO_COUNTER_TIME_INTERVAL, /* 64 bits signed int holding usecs. */
17         MONO_COUNTER_TYPE_MASK = 0xf,
18         MONO_COUNTER_CALLBACK = 128, /* ORed with the other values */
19         MONO_COUNTER_SECTION_MASK = 0x00ffff00,
20         /* Sections, bits 8-23 (16 bits) */
21         MONO_COUNTER_JIT      = 1 << 8,
22         MONO_COUNTER_GC       = 1 << 9,
23         MONO_COUNTER_METADATA = 1 << 10,
24         MONO_COUNTER_GENERICS = 1 << 11,
25         MONO_COUNTER_SECURITY = 1 << 12,
26         MONO_COUNTER_RUNTIME  = 1 << 13,
27         MONO_COUNTER_SYSTEM   = 1 << 14,
28         MONO_COUNTER_LAST_SECTION,
29
30         /* Unit, bits 24-27 (4 bits) */
31         MONO_COUNTER_UNIT_SHIFT = 24,
32         MONO_COUNTER_UNIT_MASK = 0xFu << MONO_COUNTER_UNIT_SHIFT,
33         MONO_COUNTER_RAW        = 0 << 24,  /* Raw value */
34         MONO_COUNTER_BYTES      = 1 << 24, /* Quantity of bytes. RSS, active heap, etc */
35         MONO_COUNTER_TIME       = 2 << 24,  /* Time interval in 100ns units. Minor pause, JIT compilation*/
36         MONO_COUNTER_EVENTS     = 3 << 24, /* Number of times the given event happens. Major collections, Compiled methods. */
37         MONO_COUNTER_ITEMS      = 4 << 24, /* Current number of things. Threads, queued jobs.*/
38         MONO_COUNTER_PERCENTAGE = 5 << 24, /* [0-1] Fraction Percentage of something. Load average. */
39
40         /* Monotonicity, bits 28-31 (4 bits) */
41         MONO_COUNTER_VARIANCE_SHIFT = 28,
42         MONO_COUNTER_VARIANCE_MASK = 0xFu << MONO_COUNTER_VARIANCE_SHIFT,
43         MONO_COUNTER_MONOTONIC      = 1 << 28, /* This counter value always increase/decreases over time. Reported by --stat. */
44         MONO_COUNTER_CONSTANT       = 1 << 29, /* Fixed value. Used by configuration data. */
45         MONO_COUNTER_VARIABLE       = 1 << 30, /* This counter value can be anything on each sampling. Only interesting when sampling. */
46 };
47
48 typedef struct _MonoCounter MonoCounter;
49
50
51 MONO_API void mono_counters_enable (int section_mask);
52
53 /* 
54  * register addr as the address of a counter of type type.
55  * It may be a function pointer if MONO_COUNTER_CALLBACK is specified:
56  * the function should return the value and take no arguments.
57  */
58 MONO_API void mono_counters_register (const char* descr, int type, void *addr);
59
60 /* 
61  * Create a readable dump of the counters for section_mask sections (ORed section values)
62  */
63 MONO_API void mono_counters_dump (int section_mask, FILE *outfile);
64
65 MONO_API void mono_counters_cleanup (void);
66
67 typedef mono_bool (*CountersEnumCallback) (MonoCounter *counter, void *user_data);
68
69 MONO_API void mono_counters_foreach (CountersEnumCallback cb, void *user_data);
70
71 typedef enum {
72         MONO_RESOURCE_JIT_CODE, /* bytes */
73         MONO_RESOURCE_METADATA, /* bytes */
74         MONO_RESOURCE_GC_HEAP,  /* bytes */
75         MONO_RESOURCE_COUNT /* non-ABI value */
76 } MonoResourceType;
77
78 typedef void (*MonoResourceCallback) (int resource_type, uintptr_t value, int is_soft);
79
80 MONO_API int  mono_runtime_resource_limit        (int resource_type, uintptr_t soft_limit, uintptr_t hard_limit);
81 MONO_API void mono_runtime_resource_set_callback (MonoResourceCallback callback);
82 MONO_API void mono_runtime_resource_check_limit  (int resource_type, uintptr_t value);
83
84 #endif /* __MONO_COUNTERS_H__ */
85