00001 #ifndef _CK_MEM_CHECKPT_
00002 #define _CK_MEM_CHECKPT_
00003
00004 #include "CkMemCheckpoint.decl.h"
00005
00006 extern CkGroupID ckCheckPTGroupID;
00007
00008 class CkArrayCheckPTReqMessage: public CMessage_CkArrayCheckPTReqMessage {
00009 public:
00010 CkArrayCheckPTReqMessage() {}
00011 };
00012
00013 class CkArrayCheckPTMessage: public CMessage_CkArrayCheckPTMessage {
00014 public:
00015 CkArrayID aid;
00016 CkGroupID locMgr;
00017 CkArrayIndex index;
00018 double *packData;
00019 int bud1, bud2;
00020 int len;
00021 int cp_flag;
00022 };
00023
00024 class CkProcCheckPTMessage: public CMessage_CkProcCheckPTMessage {
00025 public:
00026 int pe;
00027 int reportPe;
00028 int failedpe;
00029 int cur_restart_phase;
00030 int len;
00031 char *packData;
00032 };
00033
00034
00035 class CkCheckPTInfo {
00036 friend class CkMemCheckPT;
00037 protected:
00038 CkArrayID aid;
00039 CkGroupID locMgr;
00040 CkArrayIndex index;
00041 int pNo;
00042 public:
00043 CkCheckPTInfo();
00044 CkCheckPTInfo(CkArrayID a, CkGroupID loc, CkArrayIndex idx, int pno):
00045 aid(a), locMgr(loc), index(idx), pNo(pno) {}
00046 virtual ~CkCheckPTInfo() {}
00047 virtual void updateBuffer(CkArrayCheckPTMessage *data) = 0;
00048 virtual CkArrayCheckPTMessage * getCopy() = 0;
00049 virtual void updateBuddy(int b1, int b2) = 0;
00050 virtual int getSize() = 0;
00051 };
00052
00054 #define CkCheckPoint_inMEM 1
00055 #define CkCheckPoint_inDISK 2
00056
00057 class CkMemCheckPT: public CBase_CkMemCheckPT {
00058 public:
00059 CkMemCheckPT(int w);
00060 CkMemCheckPT(CkMigrateMessage *m):CBase_CkMemCheckPT(m) {};
00061 virtual ~CkMemCheckPT();
00062 void pup(PUP::er& p);
00063 inline int BuddyPE(int pe);
00064 void doItNow(int sp, CkCallback &);
00065 void restart(int diePe);
00066 void removeArrayElements();
00067 void createEntry(CkArrayID aid, CkGroupID loc, CkArrayIndex index, int buddy);
00068 void recvData(CkArrayCheckPTMessage *);
00069 void gotData();
00070 void recvProcData(CkProcCheckPTMessage *);
00071 void cpFinish();
00072 void syncFiles(CkReductionMsg *);
00073 void report();
00074 void recoverBuddies();
00075 void recoverEntry(CkArrayCheckPTMessage *msg);
00076 void recoverArrayElements();
00077 void quiescence(CkCallback &);
00078 void resetReductionMgr();
00079 void finishUp();
00080 void inmem_restore(CkArrayCheckPTMessage *m);
00081 void updateLocations(int n, CkGroupID *g, CkArrayIndex *idx,int nowOnPe);
00082 void resetLB(int diepe);
00083 int isFailed(int pe);
00084 public:
00085 static CkCallback cpCallback;
00086
00087 static int inRestarting;
00088 static double startTime;
00089 static char* stage;
00090 private:
00091 CkVec<CkCheckPTInfo *> ckTable;
00092
00093 int recvCount, peCount;
00094 int expectCount, ackCount;
00096 int cpStarter;
00097 CkVec<int> failedPes;
00098 int thisFailedPe;
00099
00101 int where;
00102 private:
00103 inline int isMaster(int pe);
00104
00105 void failed(int pe);
00106 int totalFailed();
00107
00108 void sendProcData();
00109 };
00110
00111
00112 void CkMemRestart(const char *, CkArgMsg *);
00113
00114
00115
00116 void CkStartMemCheckpoint(CkCallback &cb);
00117
00118
00119 extern "C" int CkInRestarting();
00120 extern "C" int CkHasCheckpoints();
00121
00122 extern "C" void CkDieNow();
00123
00124 #endif