projector trace files
[charm.git] / src / conv-perf / traceCore.C
index b3abc21307586f6d8bf18aad2f025ac42907e1ea..df134b35e8c35952f5e445ebe777662ceeeacecc 100644 (file)
@@ -7,35 +7,42 @@
 #include "traceCore.h"
 #include "traceCoreCommon.h"
 
-/***************** Class TraceCore Definition *****************/
-//TODO: currently these are dummy definitions
+#include "converseEvents.h"    //TODO: remove this hack for REGISTER_CONVESE
+#include "charmEvents.h"       //TODO: remove this hack for REGISTER_CHARM
+
+CpvExtern(int, _traceCoreOn);
+CpvExtern(double, _traceCoreInitTime);
+CpvExtern(char*, _traceCoreRoot);
+CpvExtern(int, _traceCoreBufferSize);
+CpvExtern(TraceCore*, _traceCore);
+
+/* Trace Timer */
+#define  TRACE_CORE_TIMER   CmiWallTimer
+inline double TraceCoreTimer() { return TRACE_CORE_TIMER() - CpvAccess(_traceCoreInitTime); }
 
+/***************** Class TraceCore Definition *****************/
 TraceCore::TraceCore(char** argv)
 {
        int binary = CmiGetArgFlag(argv,"+binary-trace");
-       logPool = new LogPool(CpvAccess(_traceCoreRoot), binary);
+       traceLogger = new TraceLogger(CpvAccess(_traceCoreRoot), binary);
+
+       REGISTER_CONVERSE
+       REGISTER_CHARM
 }
 
 TraceCore::~TraceCore()
-{
-       if(logPool) delete logPool;
-}
+{ if(traceLogger) delete traceLogger; }
 
-void TraceCore::RegisterLanguage(int lID)
-{
-       CmiPrintf("registering language (%d)\n", lID);
-}      
+void TraceCore::RegisterLanguage(int lID, char* ln)
+{ traceLogger->RegisterLanguage(lID, ln); }    
 
+//TODO: currently these are dummy definitions
 void TraceCore::RegisterEvent(int lID, int eID)
-{
-       CmiPrintf("registering event (%d, %d)\n", lID, eID);
-}      
+{ CmiPrintf("registering event (%d, %d)\n", lID, eID); }       
 
-//NOTE: only for compatibility with incomplete converse instrumentation
+//TODO: only for compatibility with incomplete converse instrumentation
 void TraceCore::LogEvent(int lID, int eID)
-{
-       CmiPrintf("logging event (%d, %d)\n", lID, eID);
-}
+{ LogEvent(lID, eID, 0, NULL, 0, NULL); }
 
 void TraceCore::LogEvent(int lID, int eID, int iLen, int* iData)
 { LogEvent(lID, eID, iLen, iData, 0, NULL); }
@@ -56,27 +63,41 @@ void TraceCore::LogEvent(int lID, int eID, int iLen, int* iData, int sLen, char*
        CmiPrintf("\n");
 
 
-       logPool->add(lID, eID, TraceCoreTimer(), iLen, iData, sLen, sData); 
+       traceLogger->add(lID, eID, TraceCoreTimer(), iLen, iData, sLen, sData); 
 }
 
-/***************** Class LogEntry Definition *****************/
-LogEntry::~LogEntry()
+/***************** Class TraceEntry Definition *****************/
+TraceEntry::TraceEntry(TraceEntry& te)
+{
+       languageID = te.languageID;
+       eventID    = te.eventID;
+       timestamp  = te.timestamp;
+       eLen       = te.eLen;
+       entity     = te.entity;
+       iLen       = te.iLen;
+       iData      = te.iData;
+       sLen       = te.sLen;
+       sData      = te.sData;
+}
+
+TraceEntry::~TraceEntry()
 {
        if(entity) delete [] entity;
        if(iData)  delete [] iData;
        if(sData)  delete [] sData;
 }
 
-void LogEntry::write(FILE* fp, int prevLID, int prevSeek, int nextLID, int nextSeek)
+void TraceEntry::write(FILE* fp, int prevLID, int prevSeek, int nextLID, int nextSeek)
 {
+       //NOTE: no need to write languageID to file
        if(prevLID == 0 && nextLID ==0)
-               fprintf(fp, "%d %d %f %d %d", languageID, eventID, timestamp, 0, 0); 
+               fprintf(fp, "%d %f %d %d", eventID, timestamp, 0, 0); 
        else if(prevLID == 0 && nextLID !=0)
-               fprintf(fp, "%d %d %f %d %d %d", languageID, eventID, timestamp, 0, nextLID, nextSeek); 
+               fprintf(fp, "%d %f %d %d %d", eventID, timestamp, 0, nextLID, nextSeek); 
        else if(prevLID != 0 && nextLID ==0)
-               fprintf(fp, "%d %d %f %d %d %d", languageID, eventID, timestamp, prevLID, prevSeek, 0); 
+               fprintf(fp, "%d %f %d %d %d", eventID, timestamp, prevLID, prevSeek, 0); 
        else // if(prevLID != 0 && nextLID !=0)
-               fprintf(fp, "%d %d %f %d %d %d %d", languageID, eventID, timestamp, prevLID, prevSeek, nextLID, nextSeek);
+               fprintf(fp, "%d %f %d %d %d %d", eventID, timestamp, prevLID, prevSeek, nextLID, nextSeek);
 
        fprintf(fp, " %d", eLen);
        if(eLen != 0) {
@@ -88,15 +109,21 @@ void LogEntry::write(FILE* fp, int prevLID, int prevSeek, int nextLID, int nextS
          for(int i=0; i<iLen; i++) fprintf(fp, " %d", iData[i]);  
        }
 
-       if(sLen !=0) fprintf(fp, " %s", sData);
+       if(sLen !=0) fprintf(fp, " %s\n", sData);
+       else fprintf(fp, "\n");
+
+       // free memory 
+       if(entity) delete [] entity;
+       if(iData)  delete [] iData;
+       if(sData)  delete [] sData;
 }
 
-/***************** Class LogPool Definition *****************/
-LogPool::LogPool(char* program, int b): numLangs(0)
+/***************** Class TraceLogger Definition *****************/
+TraceLogger::TraceLogger(char* program, int b): 
+       numLangs(1), numEntries(0), lastWriteFlag(0), prevLID(0), prevSeek(0) 
 {
   binary = b;
-  pool = new LogEntry[CpvAccess(_traceCoreBufferSize)];
-  numEntries = 0;
+  pool = new TraceEntry[CpvAccess(_traceCoreBufferSize)];
   poolSize = CpvAccess(_traceCoreBufferSize);
 
   pgm = new char[strlen(program)];
@@ -105,15 +132,17 @@ LogPool::LogPool(char* program, int b): numLangs(0)
   closeLogFiles();
 }
 
-LogPool::~LogPool() 
+TraceLogger::~TraceLogger() 
 {
-  if(binary) writeBinary();
-  else       write();
+  if(binary)
+  { lastWriteFlag = 1; writeBinary(); }
+  else
+  { lastWriteFlag = 1; write(); }
   delete [] pool;
   delete [] fName;
 }
 
-void LogPool::RegisterLanguage(int lID, char* ln)
+void TraceLogger::RegisterLanguage(int lID, char* ln)
 {
        numLangs++;
 
@@ -127,7 +156,7 @@ void LogPool::RegisterLanguage(int lID, char* ln)
        FILE* fp = NULL;
        do
        {
-       fp = fopen(fName[lID], "w+");
+       fp = fopen(fName[lID], "w");
        } while (!fp && (errno == EINTR || errno == EMFILE));
        if(!fp) {
        CmiAbort("Cannot open Projector Trace File for writing ... \n");
@@ -138,14 +167,13 @@ void LogPool::RegisterLanguage(int lID, char* ln)
        fclose(fp);
 }
 
-//TODO: incomplete - how to take care of first and last entry's prev and next fields
-void LogPool::write(void)
+void TraceLogger::write(void)
 {
        openLogFiles();
 
-       int currLID=0, prevLID=0, nextLID=0;
-       int pLID =0, nLID =0;
-       int currSeek=0, prevSeek=0, nextSeek=0;
+       int currLID=0, nextLID=0;
+       int pLID=0, nLID=0;
+       int currSeek=0, nextSeek=0;
        int i;
        for(i=0; i<numEntries-1; i++) {
                currLID  = pool[i].languageID;
@@ -160,40 +188,50 @@ void LogPool::write(void)
 
                prevSeek = currSeek; prevLID = currLID; 
        }
-       //pool[i].write(fptrs[pool[i].languageID], prevLID, prevSeek, 0, 0);    //NOTE: this is wrong ??
-       //TODO how to write the last entry, we donot know about next entry ??
+       if(lastWriteFlag==1) {
+               currLID  = pool[i].languageID;
+               FILE* fp = fptrs[currLID];
+               currSeek = ftell(fp); 
+               nextLID  = nextSeek = 0;
+
+               pLID = ((prevLID==currLID)?0:prevLID);
+               nLID = ((nextLID==currLID)?0:nextLID);
+               pool[i].write(fp, pLID, prevSeek, nLID, nextSeek);
+       }
 
        closeLogFiles();
 }
 
 //TODO
-void LogPool::writeBinary(void) {};
-void LogPool::writeSts(void) {};
+void TraceLogger::writeBinary(void) {};
+//TODO
+void TraceLogger::writeSts(void) {};
 
-void LogPool::add(int lID, int eID, double timestamp, int iLen, int* iData, int sLen, char* sData)
+void TraceLogger::add(int lID, int eID, double timestamp, int iLen, int* iData, int sLen, char* sData)
 {
-  new (&pool[numEntries++])
-    LogEntry(lID, eID, timestamp, iLen, iData, sLen, sData); 
+  new (&pool[numEntries++]) TraceEntry(lID, eID, timestamp, iLen, iData, sLen, sData); 
   if(poolSize==numEntries) {
     double writeTime = TraceCoreTimer();
 
     if(binary) writeBinary(); 
        else       write();
 
-    numEntries = 0;
+       // move the last entry of pool to first position
+    new (&pool[0]) TraceEntry(pool[numEntries-1]); 
+    numEntries = 1;
        //TODO
-    //new (&pool[numEntries++]) LogEntry(0, BEGIN_INTERRUPT, writeTime);
-    //new (&pool[numEntries++]) LogEntry(0, END_INTERRUPT, TraceCoreTimer());
+    //new (&pool[numEntries++]) TraceEntry(0, BEGIN_INTERRUPT, writeTime);
+    //new (&pool[numEntries++]) TraceEntry(0, END_INTERRUPT, TraceCoreTimer());
   }
 }
 
-void LogPool::openLogFiles()
+void TraceLogger::openLogFiles()
 {
-  for(int i=0; i<numLangs; i++) {
+  for(int i=1; i<numLangs; i++) {
        FILE* fp = NULL;
        do
        {
-       fp = fopen(fName[i], "w+");
+       fp = fopen(fName[i], "a");
        } while (!fp && (errno == EINTR || errno == EMFILE));
        if(!fp) {
        CmiAbort("Cannot open Projector Trace File for writing ... \n");
@@ -202,9 +240,9 @@ void LogPool::openLogFiles()
   }
 }
 
-void LogPool::closeLogFiles()
+void TraceLogger::closeLogFiles()
 {
-  for(int i=0; i<numLangs; i++)
+  for(int i=1; i<numLangs; i++)
        fclose(fptrs[i]);
 }