added example of printing parameters incoming after a restart
[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 int nElements;
7
8 class Main : public CBase_Main {
9   int step;
10   int a;
11   int b[2];
12 public:
13   Main(CkArgMsg* m){
14     step=0;     
15     a=123;b[0]=456;b[1]=789;
16     nElements=8;
17     delete m;
18
19     CkPrintf("Running Hello on %d processors for %d elements\n",CkNumPes(),nElements);
20     mainProxy = thisProxy;
21     helloProxy = CProxy_Hello::ckNew(nElements);
22     helloProxy.SayHi();
23   }
24   
25   Main(CkMigrateMessage *m) : CBase_Main(m) { 
26     if (m!=NULL) {
27       CkArgMsg *args = (CkArgMsg *)m;
28       CkPrintf("Received %d arguments: { ",args->argc);
29       for (int i=0; i<args->argc; ++i) {
30         CkPrintf("|%s| ",args->argv[i]);
31       }
32       CkPrintf("}\n");
33     } else {
34       CkPrintf("Arguments null\n");
35     }
36     mainProxy = thisProxy;
37     a=987;b[0]=654;b[1]=321;
38     CkPrintf("Main's MigCtor. a=%d(%p), b[0]=%d(%p), b[1]=%d.\n",a,&a,b[0],b,b[1]);
39   }
40
41   void myClient(CkReductionMsg *m){
42     step++;
43     int stepInc = *((int *)m->getData());
44     CkAssert(step == stepInc);
45     CkPrintf("myClient. a=%d(%p), b[0]=%d(%p), b[1]=%d.\n",a,&a,b[0],b,b[1]);
46     if(step == 3){
47       CkCallback cb(CkIndex_Hello::SayHi(),helloProxy);
48       CkStartCheckpoint("log",cb);
49     }else{
50       helloProxy.SayHi();
51     }
52     delete m;
53   }
54
55   void pup(PUP::er &p){
56     CBase_Main::pup(p);
57     p|step;
58     p|a; p(b,2);
59     CkPrintf("Main's PUPer. a=%d(%p), b[0]=%d(%p), b[1]=%d.\n",a,&a,b[0],b,b[1]);
60   }
61 };
62
63 class Hello : public CBase_Hello
64 {
65   int step;
66 public:
67   Hello(){ step = 0; }
68   Hello(CkMigrateMessage *m) : CBase_Hello(m) {}
69   
70   void SayHi(){
71     step++;
72     if(step < 10){
73       CkCallback cb(CkIndex_Main::myClient(0),mainProxy);
74       contribute(sizeof(int),(void*)&step,CkReduction::max_int,cb);
75     }else{
76       contribute(sizeof(int),(void*)&step,CkReduction::max_int,CkCallback(CkCallback::ckExit));
77     }
78   }
79   
80   void pup(PUP::er &p){
81     CBase_Hello::pup(p);
82     p|step;
83   }
84 };
85
86 #include "hello.def.h"
87