EventLog: Factor out ensureRoomFor*Event
[ghc.git] / rts / RtsProbes.d
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 2009
4  *
5  * User-space dtrace probes for the runtime system.
6  *
7  * ---------------------------------------------------------------------------*/
8
9 #ifdef __APPLE__ && __MACH__
10 # if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
11 #  define USE_INTTYPES_H_FOR_RTS_PROBES_D
12 # endif
13 #endif
14
15 #include "HsFFI.h"
16 #include "rts/EventLogFormat.h"
17
18
19 /* -----------------------------------------------------------------------------
20  * Payload datatypes for Haskell events
21  * -----------------------------------------------------------------------------
22  */
23
24 /* We effectively have:
25  *
26  * typedef uint16_t EventTypeNum;
27  * typedef uint64_t EventTimestamp;   // in nanoseconds
28  * typedef uint32_t EventThreadID;
29  * typedef uint16_t EventCapNo;
30  * typedef uint16_t EventPayloadSize; // variable-size events
31  * typedef uint16_t EventThreadStatus;
32  * typedef uint32_t EventCapsetID;
33  * typedef uint16_t EventCapsetType;  // types for EVENT_CAPSET_CREATE
34  */
35
36 /* -----------------------------------------------------------------------------
37  * The HaskellEvent provider captures everything from eventlog for use with
38  * dtrace
39  * -----------------------------------------------------------------------------
40  */
41
42 /* These probes correspond to the events defined in EventLogFormat.h
43  */
44 provider HaskellEvent {
45
46   /* scheduler events */
47   probe create__thread (EventCapNo, EventThreadID);
48   probe run__thread (EventCapNo, EventThreadID);
49   probe stop__thread (EventCapNo, EventThreadID, EventThreadStatus, EventThreadID);
50   probe thread__runnable (EventCapNo, EventThreadID);
51   probe migrate__thread (EventCapNo, EventThreadID, EventCapNo);
52   probe thread_wakeup (EventCapNo, EventThreadID, EventCapNo);
53   probe create__spark__thread (EventCapNo, EventThreadID);
54   probe thread__label (EventCapNo, EventThreadID, char *);
55
56   /* GC and heap events */
57   probe gc__start (EventCapNo);
58   probe gc__end (EventCapNo);
59   probe request__seq__gc (EventCapNo);
60   probe request__par__gc (EventCapNo);
61   probe gc__idle (EventCapNo);
62   probe gc__work (EventCapNo);
63   probe gc__done (EventCapNo);
64   probe gc__global__sync (EventCapNo);
65   probe gc__stats (EventCapsetID, StgWord, StgWord, StgWord, StgWord, StgWord, StgWord, StgWord);
66   probe heap__info (EventCapsetID, StgWord, StgWord, StgWord, StgWord, StgWord);
67   probe heap__allocated (EventCapNo, EventCapsetID, StgWord64);
68   probe heap__size (EventCapsetID, StgWord);
69   probe heap__live (EventCapsetID, StgWord);
70
71   /* capability events */
72   probe startup (EventCapNo);
73   probe cap__create (EventCapNo);
74   probe cap__delete (EventCapNo);
75   probe cap__enable (EventCapNo);
76   probe cap__disable (EventCapNo);
77
78   /* capset info events */
79   probe capset__create(EventCapsetID, EventCapsetType);
80   probe capset__delete(EventCapsetID);
81   probe capset__assign__cap(EventCapsetID, EventCapNo);
82   probe capset__remove__cap(EventCapsetID, EventCapNo);
83
84   /* spark events */
85   probe spark__counters(EventCapNo,
86                         StgWord, StgWord, StgWord,
87                         StgWord, StgWord, StgWord,
88                         StgWord);
89
90   probe spark__create   (EventCapNo);
91   probe spark__dud      (EventCapNo);
92   probe spark__overflow (EventCapNo);
93   probe spark__run      (EventCapNo);
94   probe spark__steal    (EventCapNo, EventCapNo);
95   probe spark__fizzle   (EventCapNo);
96   probe spark__gc       (EventCapNo);
97
98   /* task events */
99   probe task__create(EventTaskId, EventCapNo, EventKernelThreadId);
100   probe task__migrate(EventTaskId, EventCapNo, EventCapNo);
101   probe task__delete(EventTaskId);
102
103   /* other events */
104 /* This one doesn't seem to be used at all at the moment: */
105 /*  probe log__msg (char *); */
106   /* we don't need EVENT_BLOCK_MARKER with dtrace */
107   probe user__msg (EventCapNo, char *);
108   probe user__marker (EventCapNo, char *);
109 };