add magic number to chare base class.
authorGengbin Zheng <gzheng@illinois.edu>
Thu, 5 Jan 2012 23:03:47 +0000 (17:03 -0600)
committerGengbin Zheng <gzheng@illinois.edu>
Thu, 5 Jan 2012 23:03:47 +0000 (17:03 -0600)
sanity check after pup to make sure super class is passed.
fixed  migration constructor calling chain.

src/ck-core/charm++.h
src/ck-core/ck.C
src/ck-core/ckarray.C
src/ck-core/cklocation.C

index c5908213ff92b81c545b91d1f40e8eba5fdeeb3e..b2e381d69fa8d9740946b0088114a1547025c818 100644 (file)
@@ -248,6 +248,7 @@ PUPmarshall(CkArrayID)
 class ChareMlogData;
 #endif
 
+#define CHARE_MAGIC    0x201201
 
 /**
   The base class of all parallel objects in Charm++,
@@ -260,6 +261,9 @@ class Chare {
     CkObjectMsgQ objQ;                // object message queue
 #endif
   public:
+#if CMK_ERROR_CHECKING
+    int magic;
+#endif
 #ifndef CMK_CHARE_USE_PTR
     int chareIdx;                  // index in the chare obj table (chare_objs)
 #endif
@@ -289,6 +293,12 @@ class Chare {
     virtual void ckDebugPup(PUP::er &p);
     /// Called when a [threaded] charm entry method is created:
     virtual void CkAddThreadListeners(CthThread tid, void *msg);
+#if CMK_ERROR_CHECKING
+    inline void sanitycheck() { 
+        if (magic != CHARE_MAGIC)
+          CmiAbort("Charm++ Fatal Error> Chare magic number does not agree, possibly due to pup functions not calling parent class.");
+    }
+#endif
 };
 
 //Superclass of all Groups that cannot participate in reductions.
index 15a1cec8597a9236d88848713ac5f4467b1df36b..e70bdf86d951021892c63ae2aa22523a09b07a5e 100644 (file)
@@ -60,6 +60,9 @@ void _initChareTables()
 Chare::Chare(void) {
   thishandle.onPE=CkMyPe();
   thishandle.objPtr=this;
+#if CMK_ERROR_CHECKING
+  magic = CHARE_MAGIC;
+#endif
 #ifndef CMK_CHARE_USE_PTR
      // for plain chare, objPtr is actually the index to chare obj table
   if (CkpvAccess(currentChareIdx) >= 0) {
@@ -80,6 +83,9 @@ Chare::Chare(void) {
 Chare::Chare(CkMigrateMessage* m) {
   thishandle.onPE=CkMyPe();
   thishandle.objPtr=this;
+#if CMK_ERROR_CHECKING
+  magic = 0;
+#endif
 
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
         mlogData = NULL;
@@ -139,6 +145,9 @@ void Chare::pup(PUP::er &p)
        }
        mlogData->pup(p);
 #endif
+#if CMK_ERROR_CHECKING
+  p(magic);
+#endif
 }
 
 int Chare::ckGetChareType() const {
index 64b419a65fdf76c44b38dcfa41e14cbff7abd0a9..7ec5613e12d4f77a685db5eb7dfe320e975041f2 100644 (file)
@@ -281,7 +281,7 @@ ArrayElement::ArrayElement(void)
 #endif
 }
 
-ArrayElement::ArrayElement(CkMigrateMessage *m) 
+ArrayElement::ArrayElement(CkMigrateMessage *m) : CkMigratable(m)
 {
        initBasics();
 }
index 3b9acd0a7eaaf17b6fe09cfce14247d830449323..a49aefdf145b9fa3acd91b71316851d430065a62 100644 (file)
@@ -985,7 +985,7 @@ CkMigratable::CkMigratable(void) {
        DEBC((AA"In CkMigratable constructor\n"AB));
        commonInit();
 }
-CkMigratable::CkMigratable(CkMigrateMessage *m) {
+CkMigratable::CkMigratable(CkMigrateMessage *m): Chare(m) {
        commonInit();
 }
 
@@ -1093,7 +1093,7 @@ void CkMigratable::AtSync(int waitForMigration)
        if (!usesAtSync)
                CkAbort("You must set usesAtSync=CmiTrue in your array element constructor to use AtSync!\n");
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
-    mlogData->toResumeOrNot=1;
+        mlogData->toResumeOrNot=1;
 #endif
        myRec->AsyncMigrate(!waitForMigration);
        if (waitForMigration) ReadyMigrate(CmiTrue);
@@ -2519,6 +2519,9 @@ void CkLocMgr::pupElementsFor(PUP::er &p,CkLocRec_local *rec,
                 {
                         elt->base_pup(p);
                         elt->pup(p);
+#if CMK_ERROR_CHECKING
+                        if (p.isUnpacking()) elt->sanitycheck();
+#endif
                 }
        }
 }