fix a bug when multiple crashes. The spare processors need to be updated with the...
[charm.git] / src / ck-core / ckmemcheckpoint.h
1 #ifndef _CK_MEM_CHECKPT_
2 #define _CK_MEM_CHECKPT_
3
4 #include "CkMemCheckpoint.decl.h"
5
6 extern CkGroupID ckCheckPTGroupID;
7
8 class CkArrayCheckPTReqMessage: public CMessage_CkArrayCheckPTReqMessage {
9 public: 
10   CkArrayCheckPTReqMessage()  {}
11 };
12
13 class CkArrayCheckPTMessage: public CMessage_CkArrayCheckPTMessage {
14 public:
15         CkArrayID  aid;
16         CkGroupID  locMgr;
17         CkArrayIndex index;
18         double *packData;
19         int bud1, bud2;
20         int len;
21         int cp_flag;          // 1: from checkpoint 0: from recover
22 };
23
24 class CkProcCheckPTMessage: public CMessage_CkProcCheckPTMessage {
25 public:
26         int pe;
27         int reportPe;           // chkpt starter
28         int failedpe;
29         int cur_restart_phase;
30         int len;
31         char *packData;
32 };
33
34 // table entry base class
35 class CkCheckPTInfo {
36    friend class CkMemCheckPT;
37 protected:
38    CkArrayID aid;
39    CkGroupID locMgr;
40    CkArrayIndex index;
41    int pNo;   //another buddy
42 public:
43    CkCheckPTInfo();
44    CkCheckPTInfo(CkArrayID a, CkGroupID loc, CkArrayIndex idx, int pno):
45                   aid(a), locMgr(loc), index(idx), pNo(pno)   {}
46    virtual ~CkCheckPTInfo() {}
47    virtual void updateBuffer(CkArrayCheckPTMessage *data) = 0;
48    virtual CkArrayCheckPTMessage * getCopy() = 0;
49    virtual void updateBuddy(int b1, int b2) = 0;
50    virtual int getSize() = 0;
51 };
52
53 /// memory or disk checkpointing
54 #define CkCheckPoint_inMEM   1
55 #define CkCheckPoint_inDISK  2
56
57 class CkMemCheckPT: public CBase_CkMemCheckPT {
58 public:
59   CkMemCheckPT(int w);
60   CkMemCheckPT(CkMigrateMessage *m):CBase_CkMemCheckPT(m) {};
61   virtual ~CkMemCheckPT();
62   void pup(PUP::er& p);
63   inline int BuddyPE(int pe);
64   void doItNow(int sp, CkCallback &);
65   void restart(int diePe);
66   void removeArrayElements();
67   void createEntry(CkArrayID aid, CkGroupID loc, CkArrayIndex index, int buddy);
68   void recvData(CkArrayCheckPTMessage *);
69   void gotData();
70   void recvProcData(CkProcCheckPTMessage *);
71   void cpFinish();
72   void syncFiles(CkReductionMsg *);
73   void report();
74   void recoverBuddies();
75   void recoverEntry(CkArrayCheckPTMessage *msg);
76   void recoverArrayElements();
77   void quiescence(CkCallback &);
78   void resetReductionMgr();
79   void finishUp();
80   void inmem_restore(CkArrayCheckPTMessage *m);
81   void updateLocations(int n, CkGroupID *g, CkArrayIndex *idx,int nowOnPe);
82   void resetLB(int diepe);
83   int  isFailed(int pe);
84 public:
85   static CkCallback  cpCallback;
86
87   static int inRestarting;
88   static double startTime;
89   static char*  stage;
90 private:
91   CkVec<CkCheckPTInfo *> ckTable;
92
93   int recvCount, peCount;
94   int expectCount, ackCount;
95     /// the processor who initiate the checkpointing
96   int cpStarter;
97   CkVec<int> failedPes;
98   int thisFailedPe;
99
100     /// to use memory or disk checkpointing
101   int    where;
102 private:
103   inline int isMaster(int pe);
104
105   void failed(int pe);
106   int  totalFailed();
107
108   void sendProcData();
109 };
110
111 // called in initCharm
112 void CkMemRestart(const char *, CkArgMsg *);
113
114 // called by user applications
115 // to start a checkpointing
116 void CkStartMemCheckpoint(CkCallback &cb);
117
118 // true if inside a restarting phase
119 extern "C" int CkInRestarting(); 
120 extern "C" int CkHasCheckpoints();
121
122 #if CMK_CONVERSE_MPI
123 extern "C" void CkDieNow();
124 #endif
125
126 #endif