Revert "Drop requirement for user code to call CBase_foo::pup(p)"
[charm.git] / tests / charm++ / chkpt / hello.C
1 #include <stdio.h>
2 #include "hello.decl.h"
3
4 CProxy_Main mainProxy;
5 CProxy_Hello helloProxy;
6 CProxy_CHello chelloProxy;
7 int nElements;
8
9 class Main : public CBase_Main {
10   int step;
11   int a;
12   int b[2];
13 public:
14   Main(CkArgMsg* m){
15     step=0;     
16     a=123;b[0]=456;b[1]=789;
17     nElements=8;
18     delete m;
19
20     CkPrintf("Running Hello on %d processors for %d elements\n",CkNumPes(),nElements);
21     mainProxy = thisProxy;
22     helloProxy = CProxy_Hello::ckNew(nElements);
23     helloProxy.SayHi();
24
25     chelloProxy = CProxy_CHello::ckNew(0);
26     chelloProxy.SayHi(0);
27   }
28   
29   Main(CkMigrateMessage *m) : CBase_Main(m) { 
30     if (m!=NULL) {
31       CkArgMsg *args = (CkArgMsg *)m;
32       CkPrintf("Received %d arguments: { ",args->argc);
33       for (int i=0; i<args->argc; ++i) {
34         CkPrintf("|%s| ",args->argv[i]);
35       }
36       CkPrintf("}\n");
37     } else {
38       CkPrintf("Arguments null\n");
39     }
40       // subtle: Chare proxy readonly needs to be updated manually because of
41       // the object pointer inside it.
42     mainProxy = thisProxy;
43     a=987;b[0]=654;b[1]=321;
44     CkPrintf("Main's MigCtor. a=%d(%p), b[0]=%d(%p), b[1]=%d.\n",a,&a,b[0],b,b[1]);
45   }
46
47   void myClient(CkReductionMsg *m){
48     step++;
49
50       // if restarted from a different num of pes, we have to ignore the chare
51     if (!_restarted || _chareRestored) chelloProxy.SayHi(step);
52
53     int stepInc = *((int *)m->getData());
54     CkAssert(step == stepInc);
55     CkPrintf("myClient. a=%d(%p), b[0]=%d(%p), b[1]=%d.\n",a,&a,b[0],b,b[1]);
56     if(step == 3){
57       CkCallback cb(CkIndex_Hello::SayHi(),helloProxy);
58       CkStartCheckpoint("log",cb);
59     }else{
60       helloProxy.SayHi();
61     }
62     delete m;
63   }
64
65   void pup(PUP::er &p){
66     CBase_Main::pup(p);
67     p|step;
68     p|a; p(b,2);
69     CkPrintf("Main's PUPer. a=%d(%p), b[0]=%d(%p), b[1]=%d.\n",a,&a,b[0],b,b[1]);
70   }
71 };
72
73 class Hello : public CBase_Hello
74 {
75   int step;
76 public:
77   Hello(){ step = 0; }
78   Hello(CkMigrateMessage *m) : CBase_Hello(m) {}
79   
80   void SayHi(){
81     step++;
82     if(step < 10){
83       CkCallback cb(CkIndex_Main::myClient(0),mainProxy);
84       contribute(sizeof(int),(void*)&step,CkReduction::max_int,cb);
85     }else{
86       contribute(sizeof(int),(void*)&step,CkReduction::max_int,CkCallback(CkCallback::ckExit));
87     }
88   }
89   
90   void pup(PUP::er &p){
91     CBase_Hello::pup(p);
92     p|step;
93   }
94 };
95
96 class CHello : public CBase_CHello
97 {
98   int step;
99 public:
100   CHello(){ step = 0; }
101   CHello(CkMigrateMessage *m): CBase_CHello(m) { step = 0; }
102
103   void SayHi(int s) {
104     step = s;
105     printf("step %d done\n", step);
106   }
107
108   void pup(PUP::er &p){
109     CBase_CHello::pup(p);
110     p|step;
111     printf("CHello's PUPer. step=%d.\n", step);
112   }
113 };
114
115 #include "hello.def.h"
116