handle nested events
[charm.git] / src / ck-perf / trace-projector.C
1 /***********Projector tracing file added by Sayantan ****************/
2
3 #include "charm++.h"
4 #include "trace-projector.h"
5 #include "trace-projections.h"
6
7 #define DEBUGF(x)           // CmiPrintf x
8
9 CkpvStaticDeclare(Trace*, _traceproj);
10 class UsrEvent {
11 public:
12   int e;
13   char *str;
14   UsrEvent(int _e, char* _s): e(_e),str(_s) {}
15 };
16 typedef CkVec<UsrEvent *>   UsrEventVec;
17 CkpvStaticDeclare(UsrEventVec, usrEvents);
18
19
20 #if ! CMK_TRACE_ENABLED
21 static int warned=0;
22 #define OPTIMIZED_VERSION       \
23         if (!warned) { warned=1;        \
24         CmiPrintf("\n\n!!!! Warning: traceUserEvent not available in optimized version!!!!\n\n\n"); }
25 #else
26 #define OPTIMIZED_VERSION /*empty*/
27 #endif
28
29 /**
30   For each TraceFoo module, _createTraceFoo() must be defined.
31   This function is called in _createTraces() generated in moduleInit.C
32 */
33 void _createTraceprojector(char **argv)
34 {
35   DEBUGF(("%d createTraceProjector\n", CkMyPe()));
36   CkpvInitialize(Trace*, _traceproj);
37   CkpvInitialize(CkVec<UsrEvent *>, usrEvents);
38   CkpvAccess(_traceproj) = new  TraceProjector(argv);
39   CkpvAccess(_traces)->addTrace(CkpvAccess(_traceproj));
40 }
41
42 TraceProjector::TraceProjector(char **argv)
43 {
44         
45                 CpvInitialize(int, _traceCoreOn);
46                 CpvAccess(_traceCoreOn)=1;
47                 traceCoreOn = 1;
48
49 }
50
51 int TraceProjector::traceRegisterUserEvent(const char* evt, int e)
52 {
53 CkAssert(e==-1 || e>=0);
54   CkAssert(evt != NULL);
55   int event;
56   int biggest = -1;
57   for (int i=0; i<CkpvAccess(usrEvents).length(); i++) {
58     int cur = CkpvAccess(usrEvents)[i]->e;
59     if (cur == e) 
60       CmiAbort("UserEvent double registered!");
61     if (cur > biggest) biggest = cur;
62   }
63   // if biggest is -1, it means no user events were previously registered
64   // hence automatically assigned events will start from id of 0.
65   if (e==-1) event = biggest+1; // automatically assign new event id
66   else event = e;
67   CkpvAccess(usrEvents).push_back(new UsrEvent(event,(char *)evt));
68   return event;
69 }
70
71 void TraceProjector::traceClearEps(void)
72 {
73   // In trace-summary, this zeros out the EP bins, to eliminate noise
74   // from startup.  Here, this isn't useful, since we can do that in
75   // post-processing
76 }
77
78
79 extern "C" void writeSts(){
80         FILE *stsfp;
81         char *fname = new char[strlen(CkpvAccess(traceRoot))+strlen(".sts")+1];
82         sprintf(fname, "%s.sts", CkpvAccess(traceRoot));
83         do{
84                 stsfp = fopen(fname, "w");
85         } while (!stsfp && (errno == EINTR || errno == EMFILE));
86         if(stsfp==0)
87                 CmiAbort("Cannot open projections sts file for writing.\n");
88         delete[] fname;
89                     
90          fprintf(stsfp, "VERSION %s\n", PROJECTION_VERSION);
91          traceWriteSTS(stsfp,CkpvAccess(usrEvents).length());
92          int i;
93          for(i=0;i<CkpvAccess(usrEvents).length();i++)
94               fprintf(stsfp, "EVENT %d %s\n", CkpvAccess(usrEvents)[i]->e, CkpvAccess(usrEvents)[i]->str);
95          fprintf(stsfp, "END\n");
96         fclose(stsfp);
97                              
98 }
99
100
101 void TraceProjector::traceWriteSts(void)
102 {
103         if(CkMyPe()==0)
104                 writeSts();
105 }
106
107 void TraceProjector::traceClose(void)
108 {
109     if(CkMyPe()==0){
110             writeSts();
111     }
112     CkpvAccess(_traceproj)->endComputation();   
113     closeTraceCore(); 
114 }
115
116 void TraceProjector::traceBegin(void)
117 {
118 }
119
120 void TraceProjector::traceEnd(void) 
121 {
122 }
123
124 void TraceProjector::userEvent(int e)
125 {
126         _LOG_E_USER_EVENT_CHARM(e);
127 }
128
129 void TraceProjector::userBracketEvent(int e, double bt, double et)
130 {
131         _LOG_E_USER_EVENT_PAIR_CHARM(e,bt,et);
132 }
133
134 void TraceProjector::creation(envelope *e, int ep,int num)
135 {
136         _LOG_E_CREATION_N(e, ep, num);
137 }
138
139 void TraceProjector::beginExecute(envelope *e)
140 {
141         //_LOG_E_BEGIN_EXECUTE(e);
142         
143         charm_beginExecute(e);
144 }
145
146 void TraceProjector::beginExecute(CmiObjId  *tid)
147 {
148         // FIXME-- log this
149         
150         _LOG_E_BEGIN_EXECUTE(0);
151 }
152
153
154 void TraceProjector::beginExecute(int event,int msgType,int ep,int srcPe,int mlen,CmiObjId *idx)
155 {
156         //CmiPrintf("TraceProjector:iData in beginExecuteDetailed %d %d \n",event,srcPe);
157         _LOG_E_BEGIN_EXECUTE_DETAILED(event, msgType, ep, srcPe, mlen);
158 }
159
160 void TraceProjector::endExecute(void)
161 {
162         _LOG_E_END_EXECUTE();
163 }
164
165 void TraceProjector::messageRecv(char *env, int pe)
166 {
167         _LOG_E_MSG_RECV_CHARM(env, pe);
168 }
169
170 void TraceProjector::beginIdle(double curWallTime)
171 {
172         _LOG_E_PROC_IDLE();
173 }
174
175 void TraceProjector::endIdle(double curWallTime)
176 {
177         _LOG_E_PROC_BUSY();
178 }
179
180 void TraceProjector::beginPack(void)
181 {
182         _LOG_E_BEGIN_PACK();
183 }
184
185 void TraceProjector::endPack(void)
186 {
187         _LOG_E_END_PACK();
188 }
189
190 void TraceProjector::beginUnpack(void)
191 {
192         _LOG_E_BEGIN_UNPACK();
193 }
194
195 void TraceProjector::endUnpack(void)
196 {
197         _LOG_E_END_UNPACK();
198 }
199
200 void TraceProjector::enqueue(envelope *env) 
201 {
202         _LOG_E_ENQUEUE(env);
203 }
204
205 void TraceProjector::dequeue(envelope *env) 
206 {
207         _LOG_E_DEQUEUE(env);
208 }
209
210 void TraceProjector::beginComputation(void)
211 {
212         _LOG_E_BEGIN_COMPUTATION();
213 }
214
215 void TraceProjector::endComputation(void)
216 {
217         _LOG_E_END_COMPUTATION();
218 }
219