Changed num phases
[charm.git] / src / ck-perf / trace-memory.C
1 #include "trace-memory.h"
2
3 #define DefaultBufferSize  1000000
4
5 #define DEBUGF(x) // CmiPrintf x
6
7 CkpvStaticDeclare(TraceMemory*, _trace);
8
9 /**
10   For each TraceFoo module, _createTraceFoo() must be defined.
11   This function is called in _createTraces() generated in moduleInit.C
12 */
13 void _createTracememory(char **argv)
14 {
15   DEBUGF(("%d createTraceMemory\n", CkMyPe()));
16   CkpvInitialize(TraceMemory*, _trace);
17   CkpvAccess(_trace) = new TraceMemory(argv);
18   CkpvAccess(_traces)->addTrace(CkpvAccess(_trace));
19 }
20
21 MemEntry::MemEntry() : type(0), where(0), size(0) { }
22
23 void MemEntry::write(FILE *fp) {
24   fprintf(fp, "%d %p", type, where);
25   if (type == MEMORY_MALLOC) fprintf(fp, " %d", size);
26   fprintf(fp, "\n");
27 }
28
29 TraceMemory::TraceMemory(char **argv) {
30   usedBuffer = 0;
31   firstTime = 1;
32   logBufSize = DefaultBufferSize;
33   if (CmiGetArgIntDesc(argv,"+memlogsize",&logBufSize, 
34                        "Log entries to buffer per I/O")) {
35     if (CkMyPe() == 0) {
36       CmiPrintf("Trace: logsize: %d\n", logBufSize);
37     }
38   }
39   logBuffer = new MemEntry[logBufSize];
40 }
41
42 inline void TraceMemory::checkFlush() {
43   if (usedBuffer == logBufSize) {
44     flush();
45   }
46 }
47
48 inline void TraceMemory::flush() {
49   char *mode;
50   if (firstTime) mode = "w";
51   else mode = "a";
52   firstTime = 0;
53   // flushing the logs
54   char fname[1024];
55   sprintf(fname, "memoryLog_%d", CkMyPe());
56   FILE *fp;
57   do {
58     fp = fopen(fname, mode);
59   } while (!fp && (errno == EINTR || errno == EMFILE));
60   if (!fp) {
61     CmiAbort("Cannot open file for Memory log writing\n");
62   }
63   for (int i=0; i<usedBuffer; ++i) logBuffer[i].write(fp);
64   fclose(fp);
65   usedBuffer = 0;
66 }
67
68 void TraceMemory::traceClose() {
69   flush();
70 }
71
72 void TraceMemory::malloc(void *where, int size) {
73   logBuffer[usedBuffer++].set(MEMORY_MALLOC, where, size);
74   checkFlush();
75 }
76
77 void TraceMemory::free(void *where) {
78   logBuffer[usedBuffer++].set(MEMORY_FREE, where);
79   checkFlush();
80 }