00001
00002
00003 #include "charm++.h"
00004 #include "trace-projector.h"
00005 #include "trace-projections.h"
00006
00007 #define DEBUGF(x) // CmiPrintf x
00008
00009 CkpvStaticDeclare(Trace*, _traceproj);
00010 class UsrEvent {
00011 public:
00012 int e;
00013 char *str;
00014 UsrEvent(int _e, char* _s): e(_e),str(_s) {}
00015 };
00016 typedef CkVec<UsrEvent *> UsrEventVec;
00017 CkpvStaticDeclare(UsrEventVec, usrEvents);
00018
00019
00020 #if ! CMK_TRACE_ENABLED
00021 static int warned=0;
00022 #define OPTIMIZED_VERSION \
00023 if (!warned) { warned=1; \
00024 CmiPrintf("\n\n!!!! Warning: traceUserEvent not available in optimized version!!!!\n\n\n"); }
00025 #else
00026 #define OPTIMIZED_VERSION
00027 #endif
00028
00033 void _createTraceprojector(char **argv)
00034 {
00035 DEBUGF(("%d createTraceProjector\n", CkMyPe()));
00036 CkpvInitialize(Trace*, _traceproj);
00037 CkpvInitialize(CkVec<UsrEvent *>, usrEvents);
00038 CkpvAccess(_traceproj) = new TraceProjector(argv);
00039 CkpvAccess(_traces)->addTrace(CkpvAccess(_traceproj));
00040 }
00041
00042 TraceProjector::TraceProjector(char **argv)
00043 {
00044
00045 CpvInitialize(int, _traceCoreOn);
00046 CpvAccess(_traceCoreOn)=1;
00047 traceCoreOn = 1;
00048
00049 }
00050
00051 int TraceProjector::traceRegisterUserEvent(const char* evt, int e)
00052 {
00053 CkAssert(e==-1 || e>=0);
00054 CkAssert(evt != NULL);
00055 int event;
00056 int biggest = -1;
00057 for (int i=0; i<CkpvAccess(usrEvents).length(); i++) {
00058 int cur = CkpvAccess(usrEvents)[i]->e;
00059 if (cur == e)
00060 CmiAbort("UserEvent double registered!");
00061 if (cur > biggest) biggest = cur;
00062 }
00063
00064
00065 if (e==-1) event = biggest+1;
00066 else event = e;
00067 CkpvAccess(usrEvents).push_back(new UsrEvent(event,(char *)evt));
00068 return event;
00069 }
00070
00071 void TraceProjector::traceClearEps(void)
00072 {
00073
00074
00075
00076 }
00077
00078
00079 extern "C" void writeSts(){
00080 FILE *stsfp;
00081 char *fname = new char[strlen(CkpvAccess(traceRoot))+strlen(".sts")+1];
00082 sprintf(fname, "%s.sts", CkpvAccess(traceRoot));
00083 do{
00084 stsfp = fopen(fname, "w");
00085 } while (!stsfp && (errno == EINTR || errno == EMFILE));
00086 if(stsfp==0)
00087 CmiAbort("Cannot open projections sts file for writing.\n");
00088 delete[] fname;
00089
00090 fprintf(stsfp, "VERSION %s\n", PROJECTION_VERSION);
00091 traceWriteSTS(stsfp,CkpvAccess(usrEvents).length());
00092 int i;
00093 for(i=0;i<CkpvAccess(usrEvents).length();i++)
00094 fprintf(stsfp, "EVENT %d %s\n", CkpvAccess(usrEvents)[i]->e, CkpvAccess(usrEvents)[i]->str);
00095 fprintf(stsfp, "END\n");
00096 fclose(stsfp);
00097
00098 }
00099
00100
00101 void TraceProjector::traceWriteSts(void)
00102 {
00103 if(CkMyPe()==0)
00104 writeSts();
00105 }
00106
00107 void TraceProjector::traceClose(void)
00108 {
00109 if(CkMyPe()==0){
00110 writeSts();
00111 }
00112 CkpvAccess(_traceproj)->endComputation();
00113 closeTraceCore();
00114 }
00115
00116 void TraceProjector::traceBegin(void)
00117 {
00118 }
00119
00120 void TraceProjector::traceEnd(void)
00121 {
00122 }
00123
00124 void TraceProjector::userEvent(int e)
00125 {
00126 _LOG_E_USER_EVENT_CHARM(e);
00127 }
00128
00129 void TraceProjector::userBracketEvent(int e, double bt, double et)
00130 {
00131 _LOG_E_USER_EVENT_PAIR_CHARM(e,bt,et);
00132 }
00133
00134 void TraceProjector::creation(envelope *e, int ep,int num)
00135 {
00136 _LOG_E_CREATION_N(e, ep, num);
00137 }
00138
00139 void TraceProjector::beginExecute(envelope *e)
00140 {
00141
00142
00143 charm_beginExecute(e);
00144 }
00145
00146 void TraceProjector::beginExecute(CmiObjId *tid)
00147 {
00148
00149
00150 _LOG_E_BEGIN_EXECUTE(0);
00151 }
00152
00153
00154 void TraceProjector::beginExecute(int event,int msgType,int ep,int srcPe,int mlen,CmiObjId *idx)
00155 {
00156
00157 _LOG_E_BEGIN_EXECUTE_DETAILED(event, msgType, ep, srcPe, mlen);
00158 }
00159
00160 void TraceProjector::endExecute(void)
00161 {
00162 _LOG_E_END_EXECUTE();
00163 }
00164
00165 void TraceProjector::messageRecv(char *env, int pe)
00166 {
00167 _LOG_E_MSG_RECV_CHARM(env, pe);
00168 }
00169
00170 void TraceProjector::beginIdle(double curWallTime)
00171 {
00172 _LOG_E_PROC_IDLE();
00173 }
00174
00175 void TraceProjector::endIdle(double curWallTime)
00176 {
00177 _LOG_E_PROC_BUSY();
00178 }
00179
00180 void TraceProjector::beginPack(void)
00181 {
00182 _LOG_E_BEGIN_PACK();
00183 }
00184
00185 void TraceProjector::endPack(void)
00186 {
00187 _LOG_E_END_PACK();
00188 }
00189
00190 void TraceProjector::beginUnpack(void)
00191 {
00192 _LOG_E_BEGIN_UNPACK();
00193 }
00194
00195 void TraceProjector::endUnpack(void)
00196 {
00197 _LOG_E_END_UNPACK();
00198 }
00199
00200 void TraceProjector::enqueue(envelope *env)
00201 {
00202 _LOG_E_ENQUEUE(env);
00203 }
00204
00205 void TraceProjector::dequeue(envelope *env)
00206 {
00207 _LOG_E_DEQUEUE(env);
00208 }
00209
00210 void TraceProjector::beginComputation(void)
00211 {
00212 _LOG_E_BEGIN_COMPUTATION();
00213 }
00214
00215 void TraceProjector::endComputation(void)
00216 {
00217 _LOG_E_END_COMPUTATION();
00218 }
00219