projector files
[charm.git] / src / conv-perf / traceCore.C
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <errno.h>
5
6 #include "converse.h"
7 #include "traceCore.h"
8 #include "traceCoreCommon.h"
9
10 /***************** Class TraceCore Definition *****************/
11 //TODO: currently these are dummy definitions
12
13 TraceCore::TraceCore(char** argv)
14 {
15         int binary = CmiGetArgFlag(argv,"+binary-trace");
16         logPool = new LogPool(CpvAccess(_traceCoreRoot), binary);
17 }
18
19 TraceCore::~TraceCore()
20 {
21         if(logPool) delete logPool;
22 }
23
24 void TraceCore::RegisterLanguage(int lID)
25 {
26         CmiPrintf("registering language (%d)\n", lID);
27 }       
28
29 void TraceCore::RegisterEvent(int lID, int eID)
30 {
31         CmiPrintf("registering event (%d, %d)\n", lID, eID);
32 }       
33
34 //NOTE: only for compatibility with incomplete converse instrumentation
35 void TraceCore::LogEvent(int lID, int eID)
36 {
37         CmiPrintf("logging event (%d, %d)\n", lID, eID);
38 }
39
40 void TraceCore::LogEvent(int lID, int eID, int iLen, int* iData)
41 { LogEvent(lID, eID, iLen, iData, 0, NULL); }
42
43 void TraceCore::LogEvent(int lID, int eID, int sLen, char* sData)
44 { LogEvent(lID, eID, 0, NULL, sLen, sData); }
45
46 void TraceCore::LogEvent(int lID, int eID, int iLen, int* iData, int sLen, char* sData)
47 {
48         CmiPrintf("lID: %d, eID: %d", lID, eID);
49         if(iData != NULL) {
50                 CmiPrintf(" iData: ");
51                 for(int i=0; i<iLen; i++) { CmiPrintf("%d ", iData[i]); }
52         }
53         if(sData != NULL) {
54                 CmiPrintf("sData: %s", sData);
55         }
56         CmiPrintf("\n");
57
58
59         logPool->add(lID, eID, TraceCoreTimer(), iLen, iData, sLen, sData); 
60 }
61
62 /***************** Class LogEntry Definition *****************/
63 LogEntry::~LogEntry()
64 {
65         if(entity) delete [] entity;
66         if(iData)  delete [] iData;
67         if(sData)  delete [] sData;
68 }
69
70 void LogEntry::write(FILE* fp, int prevLID, int prevSeek, int nextLID, int nextSeek)
71 {
72         if(prevLID == 0 && nextLID ==0)
73                 fprintf(fp, "%d %d %f %d %d", languageID, eventID, timestamp, 0, 0); 
74         else if(prevLID == 0 && nextLID !=0)
75                 fprintf(fp, "%d %d %f %d %d %d", languageID, eventID, timestamp, 0, nextLID, nextSeek); 
76         else if(prevLID != 0 && nextLID ==0)
77                 fprintf(fp, "%d %d %f %d %d %d", languageID, eventID, timestamp, prevLID, prevSeek, 0); 
78         else // if(prevLID != 0 && nextLID !=0)
79                 fprintf(fp, "%d %d %f %d %d %d %d", languageID, eventID, timestamp, prevLID, prevSeek, nextLID, nextSeek);
80
81         fprintf(fp, " %d", eLen);
82         if(eLen != 0) {
83           for(int i=0; i<eLen; i++) fprintf(fp, " %d", entity[i]);  
84         }
85
86         fprintf(fp, " %d", iLen);
87         if(iLen != 0) {
88           for(int i=0; i<iLen; i++) fprintf(fp, " %d", iData[i]);  
89         }
90
91         if(sLen !=0) fprintf(fp, " %s", sData);
92 }
93
94 /***************** Class LogPool Definition *****************/
95 LogPool::LogPool(char* program, int b): numLangs(0)
96 {
97   binary = b;
98   pool = new LogEntry[CpvAccess(_traceCoreBufferSize)];
99   numEntries = 0;
100   poolSize = CpvAccess(_traceCoreBufferSize);
101
102   pgm = new char[strlen(program)];
103   sprintf(pgm, "%s", program);
104   openLogFiles();
105   closeLogFiles();
106 }
107
108 LogPool::~LogPool() 
109 {
110   if(binary) writeBinary();
111   else       write();
112   delete [] pool;
113   delete [] fName;
114 }
115
116 void LogPool::RegisterLanguage(int lID, char* ln)
117 {
118         numLangs++;
119
120         lName[lID] = new char[strlen(ln)];
121         sprintf(lName[lID], "%s", ln);
122
123         char pestr[10]; sprintf(pestr, "%d", CmiMyPe());
124         fName[lID] = new char[strlen(pgm)+1+strlen(pestr)+1+strlen(ln)+strlen(".log")];
125         sprintf(fName[lID], "%s.%s.%s.log", pgm, pestr, ln);
126
127         FILE* fp = NULL;
128         do
129         {
130         fp = fopen(fName[lID], "w+");
131         } while (!fp && (errno == EINTR || errno == EMFILE));
132         if(!fp) {
133         CmiAbort("Cannot open Projector Trace File for writing ... \n");
134         }
135         if(!binary) {
136         fprintf(fp, "PROJECTOR-RECORD: %s.%s\n", pestr, lName[lID]);
137         }
138         fclose(fp);
139 }
140
141 //TODO: incomplete - how to take care of first and last entry's prev and next fields
142 void LogPool::write(void)
143 {
144         openLogFiles();
145
146         int currLID=0, prevLID=0, nextLID=0;
147         int pLID =0, nLID =0;
148         int currSeek=0, prevSeek=0, nextSeek=0;
149         int i;
150         for(i=0; i<numEntries-1; i++) {
151                 currLID  = pool[i].languageID;
152                 FILE* fp = fptrs[currLID];
153                 currSeek = ftell(fp); 
154                 nextLID  = pool[i+1].languageID;
155                 nextSeek = ftell(fptrs[nextLID]);
156
157                 pLID = ((prevLID==currLID)?0:prevLID);
158                 nLID = ((nextLID==currLID)?0:nextLID);
159                 pool[i].write(fp, pLID, prevSeek, nLID, nextSeek);
160
161                 prevSeek = currSeek; prevLID = currLID; 
162         }
163         //pool[i].write(fptrs[pool[i].languageID], prevLID, prevSeek, 0, 0);    //NOTE: this is wrong ??
164         //TODO how to write the last entry, we donot know about next entry ??
165
166         closeLogFiles();
167 }
168
169 //TODO
170 void LogPool::writeBinary(void) {};
171 void LogPool::writeSts(void) {};
172
173 void LogPool::add(int lID, int eID, double timestamp, int iLen, int* iData, int sLen, char* sData)
174 {
175   new (&pool[numEntries++])
176     LogEntry(lID, eID, timestamp, iLen, iData, sLen, sData); 
177   if(poolSize==numEntries) {
178     double writeTime = TraceCoreTimer();
179
180     if(binary) writeBinary(); 
181         else       write();
182
183     numEntries = 0;
184         //TODO
185     //new (&pool[numEntries++]) LogEntry(0, BEGIN_INTERRUPT, writeTime);
186     //new (&pool[numEntries++]) LogEntry(0, END_INTERRUPT, TraceCoreTimer());
187   }
188 }
189
190 void LogPool::openLogFiles()
191 {
192   for(int i=0; i<numLangs; i++) {
193         FILE* fp = NULL;
194         do
195         {
196         fp = fopen(fName[i], "w+");
197         } while (!fp && (errno == EINTR || errno == EMFILE));
198         if(!fp) {
199         CmiAbort("Cannot open Projector Trace File for writing ... \n");
200         }
201         fptrs[i] = fp;
202   }
203 }
204
205 void LogPool::closeLogFiles()
206 {
207   for(int i=0; i<numLangs; i++)
208         fclose(fptrs[i]);
209 }
210