adding a test case
[IRC.git] / Robust / src / Runtime / coreprof / coreprof.h
1 #ifndef COREPROF_H
2 #define COREPROF_H
3
4
5 #ifndef COREPROF
6 // Core Prof turned off
7
8 #define CP_LOGEVENT( eventID, eventType ) ;
9 #define CP_CREATE()                       ;
10 #define CP_EXIT()                         ; 
11 #define CP_DUMP()                         ;
12
13
14 #else
15 // Core Prof defined
16
17 #include <stdlib.h>
18 #include "runtime.h"
19
20 #ifndef CP_MAXEVENTWORDS
21 #define CP_MAXEVENTWORDS (1024*128)
22 #endif
23
24
25 // MASK should be enough bits to mask
26 // the values of the following event types
27 // and BASESHIFT is for shifting IDs
28 // past the type bits
29 #define CP_EVENTTYPE_BEGIN  0x1
30 #define CP_EVENTTYPE_END    0x2
31 #define CP_EVENTTYPE_ONEOFF 0x3
32
33 #define CP_EVENT_MASK       3
34 #define CP_EVENT_BASESHIFT  8
35
36
37 // Event IDs, only those enabled explicitly as a build option
38 // will be defined and included in the compilation
39 #ifdef cpe_main
40 #define CP_EVENTID_MAIN               0x04
41 #endif
42
43 #ifdef cpe_runmalloc
44 #define CP_EVENTID_RUNMALLOC          0x10
45 #endif
46
47 #ifdef cpe_runfree
48 #define CP_EVENTID_RUNFREE            0x11
49 #endif
50
51 #ifdef cpe_poolalloc
52 #define CP_EVENTID_POOLALLOC          0x14
53 #endif
54
55 #ifdef cpe_count_poolalloc
56 #define CP_EVENTID_COUNT_POOLALLOC    0x15
57 #endif
58
59 #ifdef cpe_count_poolreuse
60 #define CP_EVENTID_COUNT_POOLREUSE    0x16
61 #endif
62
63 #ifdef cpe_workschedgrab
64 #define CP_EVENTID_WORKSCHEDGRAB      0x20
65 #endif
66
67 #ifdef cpe_workschedsubmit
68 #define CP_EVENTID_WORKSCHEDSUBMIT    0x21
69 #endif
70
71 #ifdef cpe_taskdispatch
72 #define CP_EVENTID_TASKDISPATCH       0x30
73 #endif
74
75 #ifdef cpe_preparememq
76 #define CP_EVENTID_PREPAREMEMQ        0x31
77 #endif
78
79 #ifdef cpe_taskexecute
80 #define CP_EVENTID_TASKEXECUTE        0x40
81 #endif
82
83 #ifdef cpe_taskretire
84 #define CP_EVENTID_TASKRETIRE         0x50
85 #endif
86
87 #ifdef cpe_taskstallvar
88 #define CP_EVENTID_TASKSTALLVAR       0x60
89 #endif
90
91 #ifdef cpe_taskstallmem
92 #define CP_EVENTID_TASKSTALLMEM       0x61
93 #endif
94
95 #ifdef cpe_rcr_traverse
96 #define CP_EVENTID_RCR_TRAVERSE       0x80
97 #endif
98
99
100 // debug events don't require a preprocessor
101 // guard because normally they are not in the code
102 // base--its helpful to define them in case you
103 // want to debug events that aren't worth keeping
104 // forever
105 #define CP_EVENTID_DEBUG_A 0x180
106 #define CP_EVENTID_DEBUG_B 0x181
107 #define CP_EVENTID_DEBUG_C 0x182
108 #define CP_EVENTID_DEBUG_D 0x183
109 #define CP_EVENTID_DEBUG_E 0x184
110 #define CP_EVENTID_DEBUG_F 0x185
111 #define CP_EVENTID_DEBUG_G 0x186
112 #define CP_EVENTID_DEBUG_H 0x187
113 #define CP_EVENTID_DEBUG_I 0x188
114 #define CP_EVENTID_DEBUG_J 0x189
115
116
117 // Note: application-specific events (assigned
118 // during code gen) start at 0x200
119
120
121
122 extern __thread int                     cp_threadnum;
123 extern __thread struct coreprofmonitor* cp_monitor;
124 extern          struct coreprofmonitor* cp_monitorList;
125
126
127 struct coreprofmonitor {
128   struct coreprofmonitor* next;
129   
130   // index for next unused word in the following array;
131   // individual events may use a variable number of
132   // words to store information
133   int          numWords;
134   unsigned int data[CP_MAXEVENTWORDS];
135 };
136
137
138 #ifndef COREPROF_CHECKOVERFLOW
139 #define CP_CHECKOVERFLOW ;
140 #else
141 #define CP_CHECKOVERFLOW if \
142   ( cp_monitor->numWords >= CP_MAXEVENTWORDS ) \
143   { cp_reportOverflow(); }
144 #endif
145
146
147 #define CP_LOGEVENT( eventID, eventType ) { \
148   CP_CHECKOVERFLOW; \
149   cp_monitor->data[cp_monitor->numWords] = \
150     ((eventID << CP_EVENT_BASESHIFT) | eventType); \
151   cp_monitor->numWords += 1; \
152   CP_LOGTIME; \
153 }
154
155
156 #define CP_LOGTIME CP_CHECKOVERFLOW; \
157   *((long long *)&cp_monitor->data[cp_monitor->numWords]) = rdtsc(); \
158   cp_monitor->numWords += 2;
159
160
161
162 #define CP_CREATE() cp_create();
163 #define CP_EXIT()   cp_exit();
164 #define CP_DUMP()   cp_dump();
165
166 void cp_create();
167 void cp_exit();
168 void cp_dump();
169 void cp_reportOverflow();
170
171
172 static inline void* cp_calloc( int size ) {
173 #ifdef CP_EVENTID_RUNMALLOC
174     CP_LOGEVENT( CP_EVENTID_RUNMALLOC, CP_EVENTTYPE_BEGIN );
175 #endif
176   void* mem = calloc( 1, size );
177 #ifdef CP_EVENTID_RUNMALLOC
178   CP_LOGEVENT( CP_EVENTID_RUNMALLOC, CP_EVENTTYPE_END );
179 #endif
180   return mem;
181 }
182
183 static inline void cp_free( void* ptr ) {
184 #ifdef CP_EVENTID_RUNFREE
185   CP_LOGEVENT( CP_EVENTID_RUNFREE, CP_EVENTTYPE_BEGIN );
186 #endif
187   free( ptr );
188 #ifdef CP_EVENTID_RUNFREE
189   CP_LOGEVENT( CP_EVENTID_RUNFREE, CP_EVENTTYPE_END );
190 #endif
191 }
192
193
194 #endif
195 #endif