quick implementation to make projections to have object id for array elements. last...
[charm.git] / src / ck-perf / trace-projections.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /**
9  * \addtogroup CkPerf
10 */
11 /*@{*/
12
13 #ifndef _PROJECTIONS_H
14 #define _PROJECTIONS_H
15
16 #include "trace.h"
17 #include "ck.h"
18 #include "stdio.h"
19 #include "errno.h"
20
21 #if CMK_PROJECTIONS_USE_ZLIB
22 #include <zlib.h>
23 #endif
24
25 #include "trace-common.h"
26 #include "trace-projector.h"
27
28 #define PROJECTION_VERSION  "5.0"
29
30 /// a log entry in trace projection
31 class LogEntry {
32   public:
33     double time;
34     int event;
35     int pe;
36     UShort mIdx;
37     UShort eIdx;
38     UChar type; 
39     int msglen;
40     double recvTime;
41     CmiObjId   id;
42   public:
43     LogEntry() {}
44     LogEntry(double tm, UChar t, UShort m=0, UShort e=0, int ev=0, int p=0, int ml=0, CmiObjId *d=NULL, double rt=0.) {
45       type = t; mIdx = m; eIdx = e; event = ev; pe = p; time = tm; msglen = ml;
46       if (d) id = *d; else {id.id[0]=id.id[1]=id.id[2]=0; };
47       recvTime = rt; 
48     }
49     void *operator new(size_t s) {void*ret=malloc(s);_MEMCHECK(ret);return ret;}
50     void *operator new(size_t, void *ptr) { return ptr; }
51     void operator delete(void *ptr) { free(ptr); }
52 #ifdef WIN32
53     void operator delete(void *, void *) { }
54 #endif
55     void write(FILE *fp);
56     void writeBinary(FILE *fp);
57 #if CMK_PROJECTIONS_USE_ZLIB
58     void writeCompressed(gzFile fp);
59 #endif
60 };
61
62 /// log pool in trace projection
63 class LogPool {
64   friend class TraceProjections;
65   private:
66     UInt poolSize;
67     UInt numEntries;
68     LogEntry *pool;
69     FILE *fp;
70     FILE *stsfp;
71     char *fname;
72     char *pgmname;
73     int binary;
74 #if CMK_PROJECTIONS_USE_ZLIB
75     gzFile zfp;
76     int compressed;
77 #endif
78   public:
79     LogPool(char *pgm);
80     ~LogPool();
81     void setBinary(int b) { binary = b; }
82 #if CMK_PROJECTIONS_USE_ZLIB
83     void setCompressed(int c) { compressed = c; }
84 #endif
85     void creatFiles(char *fix="");
86     void openLog(const char *mode);
87     void closeLog(void);
88     void writeLog(void);
89     void write(void);
90     void writeBinary(void);
91 #if CMK_PROJECTIONS_USE_ZLIB
92     void writeCompressed(void);
93 #endif
94     void writeSts(void);
95     void add(UChar type,UShort mIdx,UShort eIdx,double time,int event,int pe, int ml=0, CmiObjId* id=0, double recvT=0.);
96     void postProcessLog();
97 };
98
99 /// class for recording trace projections events 
100 /**
101   TraceProjections will log Converse/Charm++ events and write into .log files;
102   events descriptions will be written into .sts file.
103 */
104 class TraceProjections : public Trace {
105     LogPool* _logPool;        /**<  logpool for all events */
106     int curevent;
107     int execEvent;
108     int execEp;
109     int execPe;
110     int isIdle;
111     int cancel_beginIdle, cancel_endIdle;
112   public:
113     TraceProjections(char **argv);
114     void userEvent(int e);
115     void userBracketEvent(int e, double bt, double et);
116     void creation(envelope *e, int epIdx, int num=1);
117     void creationDone(int num=1);
118     void beginExecute(envelope *e);
119     void beginExecute(CmiObjId  *tid);
120     void beginExecute(int event,int msgType,int ep,int srcPe,int ml,CmiObjId *idx=NULL);
121     void endExecute(void);
122     void messageRecv(char *env, int pe);
123     void beginIdle(void);
124     void endIdle(void);
125     void beginPack(void);
126     void endPack(void);
127     void beginUnpack(void);
128     void endUnpack(void);
129     void enqueue(envelope *e);
130     void dequeue(envelope *e);
131     void beginComputation(void);
132     void endComputation(void);
133
134     int traceRegisterUserEvent(const char*, int);
135     void traceClearEps();
136     void traceWriteSts();
137     void traceClose();
138     void traceBegin();
139     void traceEnd();
140 };
141
142
143 #endif
144
145 /*@}*/