a little utility to record start/end events.
[charm.git] / src / langs / bluegene / bigsim_record.h
1 #ifndef BIGSIM_RECORD_H
2 #define BIGSIM_RECORD_H
3
4 extern void callAllUserTracingFunction();
5
6 extern int _heter;
7
8 /// Message watcher: for record/replay support
9 class BgMessageWatcher {
10 protected:
11         int nodelevel;
12 public:
13         virtual ~BgMessageWatcher() {}
14         /**
15          * This message is about to be processed by Charm.
16          * If this function returns false, the message will not be processed.
17          */
18         virtual CmiBool record(char *msg) { return CmiFalse; }
19         virtual int replay() { return 0; }
20         virtual void rewind() {}
21 };
22
23 class BgMessageRecorder : public BgMessageWatcher {
24         FILE *f;
25         long pos;
26 public:
27         BgMessageRecorder(FILE * f_, int node);
28         ~BgMessageRecorder() { fclose(f); }
29
30         virtual CmiBool record(char *msg);
31         virtual int replay() { return 0; }
32         virtual void rewind() {
33 //if (BgGetGlobalWorkerThreadID()==0) printf("rewind to %ld\n", pos);
34                 fseek(f, pos, SEEK_SET);
35         }
36         void write_nodeinfo();
37 };
38
39 class BgMessageReplay : public BgMessageWatcher {
40         FILE * f;
41         int lcount, rcount;
42         /// Read the next message we need from the file:
43 private:
44         void done() {
45                 int mype = BgGetGlobalWorkerThreadID();
46                 printf("[%d] BgMessageReplay> Emulation replay finished at %f seconds due to end of log.\n", mype, CmiWallTimer());
47                 printf("[%d] BgMessageReplay> Replayed %d local records and %d remote records, total of %lld bytes of data replayed.\n", mype, lcount, rcount, ftell(f));
48        }
49 public:
50         BgMessageReplay(FILE * f_, int node);
51         ~BgMessageReplay() {
52                 done();
53                 fclose(f);
54         }
55         CmiBool record(char *msg) { return CmiFalse; }
56         int replay(void);
57 };
58
59
60 extern void BgRead_nodeinfo(int node, int &startpe, int &endpe);
61
62 #endif