10 #include "traceCoreCommon.h"
12 #include "converseEvents.h" //TODO: remove this hack for REGISTER_CONVESE
13 #include "charmEvents.h" //TODO: remove this hack for REGISTER_CHARM
14 #include "machineEvents.h" // for machine events
16 CpvExtern(double, _traceCoreInitTime);
17 CpvExtern(char*, _traceCoreRoot);
18 CpvExtern(int, _traceCoreBufferSize);
19 CpvExtern(TraceCore*, _traceCore);
20 //CpvStaticDeclare(int ,staticNumEntries);
23 #define TRACE_CORE_TIMER CmiWallTimer
24 inline double TraceCoreTimer() { return TRACE_CORE_TIMER() - CpvAccess(_traceCoreInitTime); }
25 inline double TraceCoreTimer(double t) { return t - CpvAccess(_traceCoreInitTime); }
27 /***************** Class TraceCore Definition *****************/
28 TraceCore::TraceCore(char** argv)
30 int binary = CmiGetArgFlag(argv,"+binary-trace");
33 if(CpvAccess(_traceCoreOn) == 0){
38 traceLogger = new TraceLogger(CpvAccess(_traceCoreRoot), binary);
39 //CmiPrintf("[%d]In TraceCore Constructor\n",CmiMyPe());
48 TraceCore::~TraceCore()
51 if(traceLogger) delete traceLogger;
54 void TraceCore::RegisterLanguage(int lID, const char* ln)
56 //CmiPrintf("Register Language called for %s at %d \n",ln,lID);
60 traceLogger->RegisterLanguage(lID, ln);
62 // code for ptc file generation
66 lIDList[numLangs] = lID;
67 lNames[numLangs] = new char[strlen(ln)+1];
68 sprintf(lNames[numLangs],"%s",ln);
73 struct TraceCoreEvent *insert_TraceCoreEvent(struct TraceCoreEvent *root,int eID){
74 struct TraceCoreEvent *p;
77 p = (struct TraceCoreEvent *)malloc(sizeof(struct TraceCoreEvent));
83 while(p->next != NULL)
85 p->next = (struct TraceCoreEvent *)malloc(sizeof(struct TraceCoreEvent));
88 //cppcheck-suppress memleak
93 void print_TraceCoreEvent(FILE *fpPtc,struct TraceCoreEvent *root,char *lang){
94 struct TraceCoreEvent *p;
98 fprintf(fpPtc,"%d %s%d ",p->eID,lang,p->eID);
104 //TODO: currently these are dummy definitions
105 void TraceCore::RegisterEvent(int lID, int eID)
107 //CmiPrintf("registering event (%d, %d)\n", lID, eID);
108 if(traceCoreOn == 0){
111 // code for ptc file generation
112 for(int i=0;i<numLangs;i++){
113 if(lIDList[i] == lID){
118 eventLists[i] = insert_TraceCoreEvent(eventLists[i],eID);
124 void TraceCore::startPtc(){
128 char *str = new char[strlen(CpvAccess(_traceCoreRoot))+strlen(".ptc")+1];
129 sprintf(str,"%s.ptc",CpvAccess(_traceCoreRoot));
130 fpPtc = fopen(str,"w");
132 CmiAbort("Can't generate Ptc file");
134 fprintf(fpPtc,"%d\n",CmiNumPes());
135 for(int i=0;i<MAX_NUM_LANGUAGES;i++){
136 eventLists[i] = NULL;
146 void TraceCore::closePtc(){
151 fprintf(fpPtc,"%d %d ",maxlID,numLangs);
152 for(i=0;i<numLangs;i++){
153 fprintf(fpPtc,"%d %s ",lIDList[i],lNames[i]);
156 for(i=0;i<numLangs;i++){
157 fprintf(fpPtc,"%d %d %d ",lIDList[i],maxeID[i],numEvents[i]);
158 print_TraceCoreEvent(fpPtc,eventLists[i],lNames[i]);
167 //TODO: only for compatibility with incomplete converse instrumentation
168 void TraceCore::LogEvent(int lID, int eID)
170 if(traceCoreOn == 0){
173 LogEvent(lID, eID, 0, NULL, 0, NULL);
176 void TraceCore::LogEvent(int lID, int eID, int iLen, const int* iData)
178 if(traceCoreOn == 0){
181 LogEvent(lID, eID, iLen, iData, 0, NULL);
184 void TraceCore::LogEvent(int lID, int eID, int iLen, const int* iData,double t){
185 if(traceCoreOn == 0){
188 CmiPrintf("TraceCore LogEvent called \n");
189 #if CMK_TRACE_ENABLED
192 iDataalloc = (int *)malloc(iLen*sizeof(int));
193 for(int i=0;i<iLen;i++){
194 iDataalloc[i] = iData[i];
199 traceLogger->add(lID,eID,TraceCoreTimer(t),iLen,iDataalloc,0,NULL);
204 void TraceCore::LogEvent(int lID, int eID, int sLen, const char* sData)
206 if(traceCoreOn == 0){
209 LogEvent(lID, eID, 0, NULL, sLen, sData);
212 void TraceCore::LogEvent(int lID, int eID, int iLen, const int* iData, int sLen,const char* sData)
214 //CmiPrintf("lID: %d, eID: %d", lID, eID);
215 if(traceCoreOn == 0){
220 #if CMK_TRACE_ENABLED
224 iDataalloc = (int *)malloc(iLen*sizeof(int));
225 for(int i=0;i<iLen;i++){
226 iDataalloc[i] = iData[i];
232 sDataalloc = (char *)malloc(sLen*sizeof(char));
233 for(int i=0;i<sLen;i++){
234 sDataalloc[i] = sData[i];
240 traceLogger->add(lID, eID, TraceCoreTimer(), iLen, iDataalloc, sLen, sDataalloc);
244 /***************** Class TraceEntry Definition *****************/
245 TraceEntry::TraceEntry(TraceEntry& te)
247 languageID = te.languageID;
248 eventID = te.eventID;
249 timestamp = te.timestamp;
258 TraceEntry::~TraceEntry()
260 if(entity) free(entity);
261 if(iData) free(iData);
262 if(sData) free(sData);
265 void TraceEntry::write(FILE* fp, int prevLID, int prevSeek, int nextLID, int nextSeek)
267 //NOTE: no need to write languageID to file
268 if(prevLID == 0 && nextLID ==0)
269 fprintf(fp, "%d %f %d %d ", eventID, timestamp, 0, 0);
270 else if(prevLID == 0 && nextLID !=0)
271 fprintf(fp, "%d %f %d %d %d", eventID, timestamp, 0, nextLID, nextSeek);
272 else if(prevLID != 0 && nextLID ==0)
273 fprintf(fp, "%d %f %d %d %d", eventID, timestamp, prevLID, prevSeek, 0);
274 else // if(prevLID != 0 && nextLID !=0)
275 fprintf(fp, "%d %f %d %d %d %d", eventID, timestamp, prevLID, prevSeek, nextLID, nextSeek);
277 fprintf(fp, " %d", eLen);
279 for(int i=0; i<eLen; i++) fprintf(fp, " %d", entity[i]);
282 fprintf(fp, " %d", iLen);
284 for(int i=0; i<iLen; i++) fprintf(fp, " %d", iData[i]);
287 if(sLen !=0) fprintf(fp, " %s\n", sData);
288 else fprintf(fp, "\n");
305 /***************** Class TraceLogger Definition *****************/
306 TraceLogger::TraceLogger(char* program, int b):
307 numEntries(0), numLangs(1), lastWriteFlag(false), prevLID(0), prevSeek(0)
313 poolSize = 10000; // CkpvAccess(CtrLogBufSize);
314 pool = new TraceEntry[poolSize+5];
315 // CmiPrintf("CtrLogBufSize %d \n",CkpvAccess(CtrLogBufSize));
316 // CmiPrintf("PoolSize = %d \n",poolSize);
317 for (int lID=0;lID<MAX_NUM_LANGUAGES;lID++) {
322 pgm = new char[strlen(program)+1];
323 sprintf(pgm, "%s", program);
328 //CmiPrintf("In TraceLogger Constructor %s %d",pgm,strlen(program)+1);
333 void TraceLogger::initlogfiles(){
339 TraceLogger::~TraceLogger()
342 { lastWriteFlag = true; writeBinary(); }
344 { lastWriteFlag = true; write(); }
345 for (int lID=0;lID<MAX_NUM_LANGUAGES;lID++) {
351 void TraceLogger::RegisterLanguage(int lID, const char* ln)
355 lName[lID] = new char[strlen(ln)+1];
356 sprintf(lName[lID], "%s", ln);
358 char pestr[10]; sprintf(pestr, "%d", CmiMyPe());
359 fName[lID] = new char[strlen(pgm)+1+strlen(pestr)+1+strlen(ln)+strlen(".log")+10];
360 sprintf(fName[lID], "%s.%s.%s.log", pgm, pestr, ln);
362 // my debug code - schak
363 //CmiPrintf("%s at %d in %d \n",fName[lID],lID,fName[lID]);
364 if(CpvAccess(_traceCoreOn) == 0){
365 CmiPrintf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1_traceCoreOn = 0 in RegisterLanguage \n");
371 fp = fopen(fName[lID], "w");
372 } while (!fp && (errno == EINTR || errno == EMFILE));
374 CmiAbort("Cannot open Projector Trace File for writing ... \n");
377 fprintf(fp, "PROJECTOR-RECORD: %s.%s\n", pestr, lName[lID]);
383 void TraceLogger::verifyFptrs(){
385 for(int i=1; i<numLangs; i++){
387 CmiPrintf("Null File Pointer Found after Open\n");
392 void TraceLogger::write(void)
394 if(CpvAccess(_traceCoreOn) == 0){
399 int currLID=0, nextLID=0;
401 int currSeek=0, nextSeek=0;
403 for(i=0; i<numEntries-1; i++) {
404 currLID = pool[i].languageID;
405 FILE* fp = fptrs[currLID];
408 currSeek = ftell(fp);
409 nextLID = pool[i+1].languageID;
410 nextSeek = ftell(fptrs[nextLID]);
412 pLID = ((prevLID==currLID)?0:prevLID);
413 nLID = ((nextLID==currLID)?0:nextLID);
414 pool[i].write(fp, pLID, prevSeek, nLID, nextSeek);
416 prevSeek = currSeek; prevLID = currLID;
420 currLID = pool[i].languageID;
421 FILE* fp = fptrs[currLID];
424 currSeek = ftell(fp);
425 nextLID = nextSeek = 0;
427 pLID = ((prevLID==currLID)?0:prevLID);
428 nLID = ((nextLID==currLID)?0:nextLID);
429 pool[i].write(fp, pLID, prevSeek, nLID, nextSeek);
437 void TraceLogger::writeBinary(void) {}
439 void TraceLogger::writeSts(void) {}
441 void TraceLogger::add(int lID, int eID, double timestamp, int iLen, int* iData, int sLen, char* sData)
445 // CmiPrintf("Printing in buffer \n");
446 buffer = new TraceEntry(lID, eID, timestamp, iLen, iData, sLen, sData);
448 new (&pool[numEntries]) TraceEntry(lID, eID, timestamp, iLen, iData, sLen, sData);
449 numEntries = numEntries+1;
450 if(numEntries>= poolSize) {
451 double writeTime = TraceCoreTimer();
453 if(binary) writeBinary();
457 new (&pool[0]) TraceEntry(pool[numEntries-1]);
461 new (&pool[1]) TraceEntry(*buffer);
468 //new (&pool[numEntries++]) TraceEntry(0, BEGIN_INTERRUPT, writeTime);
469 //new (&pool[numEntries++]) TraceEntry(0, END_INTERRUPT, TraceCoreTimer());
474 void TraceLogger::openLogFiles()
476 CmiPrintf("[%d]Entering openLogFile \n",CmiMyPe());
477 for(int i=1; i<numLangs; i++) {
483 fp = fopen(fName[i], "a");
485 } while (!fp && (errno == EINTR || errno == EMFILE));
487 // CmiPrintf("FILE NAME %s at %d \n",fName[i],i);
488 CmiAbort("Cannot open Projector Trace File for writing ... \n");
490 CmiPrintf("[%d]Iteration %d : fp %d \n",CmiMyPe(),i,fp);
510 CmiPrintf("[%d]In Open log files ........\n",CmiMyPe());
512 CmiPrintf("[%d].....................\n",CmiMyPe());
515 void TraceLogger::closeLogFiles()
518 for(int i=1; i<numLangs; i++){
526 void TraceLogger::flushLogFiles(){
527 for(int i=1;i<numLangs;i++){