Changed num phases
authorFilippo Gioachin <gioachin@illinois.edu>
Tue, 11 Sep 2007 21:43:01 +0000 (21:43 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Tue, 11 Sep 2007 21:43:01 +0000 (21:43 +0000)
src/ck-perf/trace-common.h
src/ck-perf/trace-memory.C [new file with mode: 0644]
src/ck-perf/trace-memory.h [new file with mode: 0644]
src/ck-perf/trace-recordreplay.C
src/ck-perf/trace-summary.h
src/ck-perf/trace.h
src/ck-perf/tracec.C [new file with mode: 0644]
src/ck-perf/tracec.h [new file with mode: 0644]

index 358f2c2ae90aa276bc59b3912e7e87142681aa71..ce42b3eeb24bec4fd9df3f4ae7c4c3296c949e4c 100644 (file)
 #define         BEGIN_FUNC         22
 #define         END_FUNC           23
 
+/* Memory tracing */
+#define  MEMORY_MALLOC      24
+#define  MEMORY_FREE        25
+
 #define  USER_EVENT_PAIR    100
 
 CkpvExtern(int, CtrLogBufSize);
diff --git a/src/ck-perf/trace-memory.C b/src/ck-perf/trace-memory.C
new file mode 100644 (file)
index 0000000..437b3da
--- /dev/null
@@ -0,0 +1,80 @@
+#include "trace-memory.h"
+
+#define DefaultBufferSize  1000000
+
+#define DEBUGF(x) // CmiPrintf x
+
+CkpvStaticDeclare(TraceMemory*, _trace);
+
+/**
+  For each TraceFoo module, _createTraceFoo() must be defined.
+  This function is called in _createTraces() generated in moduleInit.C
+*/
+void _createTracememory(char **argv)
+{
+  DEBUGF(("%d createTraceMemory\n", CkMyPe()));
+  CkpvInitialize(TraceMemory*, _trace);
+  CkpvAccess(_trace) = new TraceMemory(argv);
+  CkpvAccess(_traces)->addTrace(CkpvAccess(_trace));
+}
+
+MemEntry::MemEntry() : type(0), where(0), size(0) { }
+
+void MemEntry::write(FILE *fp) {
+  fprintf(fp, "%d %p", type, where);
+  if (type == MEMORY_MALLOC) fprintf(fp, " %d", size);
+  fprintf(fp, "\n");
+}
+
+TraceMemory::TraceMemory(char **argv) {
+  usedBuffer = 0;
+  firstTime = 1;
+  logBufSize = DefaultBufferSize;
+  if (CmiGetArgIntDesc(argv,"+memlogsize",&logBufSize, 
+                      "Log entries to buffer per I/O")) {
+    if (CkMyPe() == 0) {
+      CmiPrintf("Trace: logsize: %d\n", logBufSize);
+    }
+  }
+  logBuffer = new MemEntry[logBufSize];
+}
+
+inline void TraceMemory::checkFlush() {
+  if (usedBuffer == logBufSize) {
+    flush();
+  }
+}
+
+inline void TraceMemory::flush() {
+  char *mode;
+  if (firstTime) mode = "w";
+  else mode = "a";
+  firstTime = 0;
+  // flushing the logs
+  char fname[1024];
+  sprintf(fname, "memoryLog_%d", CkMyPe());
+  FILE *fp;
+  do {
+    fp = fopen(fname, mode);
+  } while (!fp && (errno == EINTR || errno == EMFILE));
+  if (!fp) {
+    CmiAbort("Cannot open file for Memory log writing\n");
+  }
+  for (int i=0; i<usedBuffer; ++i) logBuffer[i].write(fp);
+  fclose(fp);
+  usedBuffer = 0;
+}
+
+void TraceMemory::traceClose() {
+  flush();
+}
+
+void TraceMemory::malloc(void *where, int size) {
+  logBuffer[usedBuffer++].set(MEMORY_MALLOC, where, size);
+  checkFlush();
+}
+
+void TraceMemory::free(void *where) {
+  logBuffer[usedBuffer++].set(MEMORY_FREE, where);
+  checkFlush();
+}
diff --git a/src/ck-perf/trace-memory.h b/src/ck-perf/trace-memory.h
new file mode 100644 (file)
index 0000000..cd51778
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef __TRACE_MEMORY_H__
+#define __TRACE_MEMORY_H__
+
+#include "charm++.h"
+#include "trace.h"
+#include "trace-common.h"
+#include <errno.h>
+
+/** A representant of a memory operation */
+
+class MemEntry {
+ private:
+  int type;
+  void *where;
+  int size;
+  
+ public:  
+  MemEntry();
+  void write(FILE *fp);
+  void set(int t, void *w, int s=0) {
+    type = t;
+    where = w;
+    size = s;
+  }
+};
+
+/**
+   class to trace all memory related events. Currently works only in conjunction
+   with "-memory charmdebug".
+*/
+class TraceMemory : public Trace {
+ private:
+  int firstTime;
+  int logBufSize;
+  int usedBuffer;
+  MemEntry *logBuffer;
+  void checkFlush();
+  void flush();
+ public:
+  TraceMemory(char **argv);
+  
+  void traceClose();
+  void malloc(void *where, int size);
+  void free(void *where);
+};
+
+#endif
index ca3abd8902fecb518aeca0ec7e98641f2adfc38f..2c8c658324c14100cc8621bf473f9cc13ab203ee 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "charm++.h"
 #include "trace-recordreplay.h"
+#include "signal.h"
 
 #define DEBUGF(x)  // CmiPrintf x
 
@@ -33,12 +34,19 @@ void _createTracerecordreplay(char **argv)
   CkpvAccess(_traces)->addTrace(CkpvAccess(_trace));
 }
 
+typedef void (*sigfunc)(int);
+CkpvStaticDeclare(sigfunc, segfault_sig);
+
+void segfault_signal(int sig) {
+  printf("Segfault handler reached!\n");
+  signal(SIGSEGV, CkpvAccess(segfault_sig));
+}
 
 TraceRecordReplay::TraceRecordReplay(char **argv):curevent(1)
 {
+  //CkpvAccess(segfault_sig) = signal(SIGSEGV, segfault_signal);
 }
 
-
 void TraceRecordReplay::beginExecute(envelope *e)
 {
   // no message means thread execution
index a2302304d172e0dab081c49e90b2574a8ea3c315..c75091234a7f1ad06604a65cf2ab2e3c022cb985 100644 (file)
@@ -26,7 +26,7 @@
 
 #define  MAX_MARKS       256
 
-#define  MAX_PHASES       10
+#define  MAX_PHASES       100
 
 /// Bin entry record CPU time in an interval
 class BinEntry {
index a232fc8fc6ece7ba69bc7670b2945a2c0cb10b53..7352f720be6e71d61f5a14939149f1610e88212f 100644 (file)
@@ -127,6 +127,10 @@ class Trace {
     virtual void endFunc(char *name){}    
     virtual void endFunc(int idx){}
 
+    /* Memory tracing */
+    virtual void malloc(void *where, int size){}
+    virtual void free(void *where){}
+
     /* for implementing thread listeners */
     virtual void traceAddThreadListeners(CthThread tid, envelope *e) {}
 
@@ -217,6 +221,10 @@ public:
     inline void endFunc(char *name){ ALLDO(endFunc(name)); }
     inline void endFunc(int idx){ ALLDO(endFunc(idx)); }
 
+    /* Memory tracing */
+    inline void malloc(void *where, int size){ ALLDO(malloc(where,size)); }
+    inline void free(void *where){ ALLDO(free(where)); }
+
     /* calls for thread listener registration for each trace module */
     inline void traceAddThreadListeners(CthThread tid, envelope *e) {
       ALLDO(traceAddThreadListeners(tid, e));
@@ -260,6 +268,11 @@ extern "C" {
 #define _TRACE_ENQUEUE(env) _TRACE_ONLY(CkpvAccess(_traces)->enqueue(env))
 #define _TRACE_DEQUEUE(env) _TRACE_ONLY(CkpvAccess(_traces)->dequeue(env))
 
+/* Memory tracing */
+#define _TRACE_MALLOC(where, size) _TRACE_ONLY(CkpvAccess(_traces)->malloc(where,size))
+#define _TRACE_FREE(where) _TRACE_ONLY(CkpvAccess(_traces)->free(where))
+
+
 #include "trace-bluegene.h"
 
 #endif
diff --git a/src/ck-perf/tracec.C b/src/ck-perf/tracec.C
new file mode 100644 (file)
index 0000000..291e3bb
--- /dev/null
@@ -0,0 +1,16 @@
+#include "charm++.h"
+#include "trace-common.h"
+#include "trace.h"
+#include "tracec.h"
+
+extern "C" {
+
+  void traceMalloc_c(void *where, int size) {
+    _TRACE_MALLOC(where, size);
+  }
+
+  void traceFree_c(void *where) {
+    _TRACE_FREE(where);
+  }
+
+}
diff --git a/src/ck-perf/tracec.h b/src/ck-perf/tracec.h
new file mode 100644 (file)
index 0000000..d037761
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __TRACEC_H__
+#define __TRACEC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  extern void traceMalloc_c(void *where, int size);
+  extern void traceFree_c(void *where);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif