Revert "Drop requirement for user code to call CBase_foo::pup(p)"
[charm.git] / tests / charm++ / megatest / migration.C
1 #include "migration.h"
2
3 void migration_init(void)
4 {
5   const int numElements = 10;
6   if(CkNumPes() < 2) {
7     CkError("migration: requires at least 2 processors.\n");
8     megatest_finish();
9   } else
10     CProxy_mig_Element::ckNew(numElements);
11 }
12
13 void migration_moduleinit(void){}
14
15 mig_Element::mig_Element()
16 {
17   origPE = -1;
18   sum = 0;
19   index = thisIndex;
20   numDone = 0;
21   CProxy_mig_Element self(thisArrayID);
22   self[thisIndex].arrive();
23 }
24
25 void mig_Element::pup(PUP::er &p)
26 {
27   CBase_mig_Element::pup(p);//Call superclass
28   p(origPE);
29   p(sum);
30   p(numDone);
31   p(index);
32 }
33
34 void 
35 mig_Element::arrive(void)
36 {
37   if (thisIndex != index) 
38     CkAbort("migration: chare-data corrupted!\n");
39   CProxy_mig_Element self(thisArrayID);
40   if(CkMyPe() == origPE) {
41     if(sum != ((CkNumPes()+1)*CkNumPes())/2)
42       CkAbort("migrate: Element did not migrate to all the processors!\n");
43     self[0].done();
44   } else {
45     if(origPE==(-1)) origPE = CkMyPe();
46     sum += CkMyPe() + 1;
47     self[thisIndex].arrive();
48     int nextPE = (CkMyPe()+1)%CkNumPes();
49     migrateMe(nextPE);
50   }  
51 }
52
53 void
54 mig_Element::done(void)
55 {
56   numDone++;
57   if(numDone==ckGetArraySize())
58     megatest_finish();
59 }
60
61 MEGATEST_REGISTER_TEST(migration,"jackie",1)
62 #include "migration.def.h"