fix for migration
[charm.git] / src / ck-core / cklocation.C
index e37ca88ad453507b877a2cfa7e95b10bb743f754..97602046eedd00641cb48d8f35eac00810116856 100644 (file)
@@ -1089,7 +1089,7 @@ void CkMigratable::pup(PUP::er &p) {
        p(usesAutoMeasure);
 #if CMK_LBDB_ON 
        int readyMigrate;
-       if (p.isPacking()||p.isChecking()) readyMigrate = myRec->isReadyMigrate();
+       if (p.isPacking()||p.isCalChecking()) readyMigrate = myRec->isReadyMigrate();
        p|readyMigrate;
        if (p.isUnpacking()) myRec->ReadyMigrate(readyMigrate);
 #endif
@@ -1100,7 +1100,9 @@ void CkMigratable::pup(PUP::er &p) {
        p | asyncEvacuate;
        if(p.isUnpacking()){myRec->AsyncEvacuate(asyncEvacuate);}
        
-       p | atsync_chkp_iter;   
+       if(p.isUnpacking()){
+         atsync_chkp_iter = -1;
+       }
        if(p.isUnpacking()){
                resetForChkp();
        }
@@ -1231,9 +1233,9 @@ void CkMigratable::ckFinishConstruction(void)
 
 void CkMigratable::setChkpResumeClient(CkCallback & _cb)
 {
-        if(CmiMyPartition()==1){
-          //CkPrintf("[%d] setChkpResumeClient\n",CkMyPe());
-        }
+        //if(CmiMyPartition()==1){
+          CkPrintf("[%d] setChkpResumeClient\n",CkMyPe());
+        //}
        chkp_cb = _cb;
        nextChkpIter = -1;
        nextChkpDecided = false;
@@ -1245,6 +1247,9 @@ void CkMigratable::setChkpResumeClient(CkCallback & _cb)
 void CkMigratable::AtChkpSync()
 {
        if(usesChkpAtSync){
+         if(CkMyPe()==0){
+//         CkPrintf("at chkp sync\n");
+         }
                if(CmiNumPartition()==1){
                        chkp_cb.send();
                        return;
@@ -1297,6 +1302,9 @@ void CkMigratable::recvChkpIter(void * _iter){
                int iter = *(int *)_iter;
                nextChkpIter = iter;
                nextChkpDecided = true;
+               //if(CkMyPe()==0){
+               //  CkPrintf("receive chkp iter %d %d\n",atsync_chkp_iter, nextChkpIter);
+               //}
                if(atsync_chkp_iter>nextChkpIter){
                        CkAbort("impossible state in notify\n");
                }
@@ -2080,6 +2088,7 @@ inline void CkLocMgr::springCleaning(void)
     if (rec->isObsolete(nSprings,idx)) {
       //This record is obsolete-- remove it from the table
       DEBK((AA"Cleaning out old record %s\n"AB,idx2str(idx)));
+      //CkPrintf("[%d][%d]Cleaning out old record %s\n",CmiMyPartition(),CkMyPe(),idx2str(idx));
       hash.remove(*(CkArrayIndex *)&idx);
       delete rec;
       it->seek(-1);//retry this hash slot
@@ -2092,16 +2101,26 @@ void CkLocMgr::staticSpringCleaning(void *forWhom,double curWallTime) {
        DEBK((AA"Starting spring cleaning at %.2f\n"AB,CkWallTimer()));
        ((CkLocMgr *)forWhom)->springCleaning();
 }
+static const char *rec2str[]={
+    "base (INVALID)",//Base class (invalid type)
+    "local",//Array element that lives on this Pe
+    "remote",//Array element that lives on some other Pe
+    "buffering",//Array element that was just created
+    "dead"//Deleted element (for debugging)
+};
+
 //doesn't delete if there is extra pe
 void CkLocMgr::flushLocalRecs(void)
 {
   void *objp;
   void *keyp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
     CkArrayIndex &idx=*(CkArrayIndex *)keyp;
+    //if(CmiMyPartition()==1)
+      //CkPrintf("[%d][%d] flush home object %s %p %p\n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec,hash.get(*(CkArrayIndex *)&idx));
     if (rec->type() == CkLocRec::local) {
         callMethod((CkLocRec_local*)rec, &CkMigratable::ckDestroy);
         it->seek(-1);//retry this hash slot
@@ -2115,7 +2134,7 @@ void CkLocMgr::recvChkpIter(int iter)
 {
   void *objp;
   void *keyp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
@@ -2131,7 +2150,7 @@ void CkLocMgr::recvChkpIter(int iter)
 void CkLocMgr::resumeFromChkp(){
   void *objp;
   void *keyp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
@@ -2308,30 +2327,35 @@ void CkLocMgr::pup(PUP::er &p){
         void *keyp;
         CkVec<int> pe_list;
         CkVec<CkArrayIndex> idx_list;
-        CkHashtableIterator *it = hash.iterator();
-      while (NULL!=(objp=it->next(&keyp))) {
+        //CkHashtableIterator *it = hash.iterator();
+        CkHashtableIterator *it = homeObjHash.iterator();
+      while (homeObjHash.numObjects()!=0&&NULL!=(objp=it->next(&keyp))) {
           CkLocRec *rec=*(CkLocRec **)objp;
           CkArrayIndex &idx=*(CkArrayIndex *)keyp;
-            if(rec->type() != CkLocRec::local){
-                if(homePe(idx) == CmiMyPe()){
-                  int pe;
-                  CkArrayIndex max = idx;
-                  pe = rec->lookupProcessor();
-                  idx_list.push_back(max);
-                  pe_list.push_back(pe);
-                    count++;
-                }
-            }
-        }
-        p | count;
 
-               // releasing iterator memory
-               delete it;
+          //if(CmiMyPartition()==0&&CkMyPe()==0)
+            //CkPrintf("[%d][%d] pup home object %s rec %s\n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec2str[rec->type()]);
+            //CkPrintf("[%d][%d] pup home object %s rec %p\n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec);
+          if(rec!=NULL&&rec->type() != CkLocRec::local){
+              if(homePe(idx) == CmiMyPe()){
+                int pe;
+                CkArrayIndex max = idx;
+                pe = rec->lookupProcessor();
+                idx_list.push_back(max);
+                pe_list.push_back(pe);
+                  count++;
+              }
+          }
+      }
+      p | count;
+
+              // releasing iterator memory
+              delete it;
 
-      for(int i=0;i<pe_list.length();i++){
-        CkArrayIndex max = idx_list[i];
-        max.pup(p);
-        p|pe_list[i];
+    for(int i=0;i<pe_list.length();i++){
+      CkArrayIndex max = idx_list[i];
+      max.pup(p);
+      p|pe_list[i];
       }
     /*    it = hash.iterator();
       while (NULL!=(objp=it->next(&keyp))) {
@@ -2488,7 +2512,6 @@ CmiBool CkLocMgr::addElement(CkArrayID id,const CkArrayIndex &idx,
                   thisProxy.updateLocation(idx, CkMyPe());  
                 }
 #endif
-                
        } else 
        { //rec is *already* local-- must not be the first insertion    
                rec=((CkLocRec_local *)oldRec);
@@ -2583,6 +2606,10 @@ void CkLocMgr::removeFromTable(const CkArrayIndex &idx) {
                CkAbort("CkLocMgr::removeFromTable called on invalid index!");
 #endif
         CmiImmediateLock(hashImmLock);
+       CkLocRec *old=elementNrec(idx);
+        if(old->type()==CkLocRec::local){
+          localHash.remove(*(CkArrayIndex *)&idx);
+        }
        hash.remove(*(CkArrayIndex *)&idx);
         CmiImmediateUnlock(hashImmLock);
 #if CMK_ERROR_CHECKING
@@ -2846,11 +2873,27 @@ void CkLocMgr::iterate(CkLocIterator &dest) {
   delete it;
 }
 
+void CkLocMgr::iterateLocal(CkLocIterator &dest) {
+  //Poke through the hash table for local ArrayRecs.
+  void *objp;
+  CkHashtableIterator *it=localHash.iterator();
+  CmiImmediateLock(hashImmLock);
+
+  while (NULL!=(objp=it->next())) {
+    CkLocRec *rec=*(CkLocRec **)objp;
+    if (rec->type()==CkLocRec::local) {
+      CkLocation loc(this,(CkLocRec_local *)rec);
+      dest.addLocation(loc);
+    }
+  }
+  CmiImmediateUnlock(hashImmLock);
+  delete it;
+}
 
 void CkLocMgr::iterateChkpSync(CkLocIterator &dest) {
   //Poke through the hash table for local ArrayRecs.
   void *objp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
 
   while (NULL!=(objp=it->next())) {
@@ -3322,13 +3365,6 @@ bool CkLocMgr::isRemote(const CkArrayIndex &idx,int *onPe) const
        }
 }
 
-static const char *rec2str[]={
-    "base (INVALID)",//Base class (invalid type)
-    "local",//Array element that lives on this Pe
-    "remote",//Array element that lives on some other Pe
-    "buffering",//Array element that was just created
-    "dead"//Deleted element (for debugging)
-};
 
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
 void CkLocMgr::setDuringMigration(CmiBool _duringMigration){
@@ -3343,6 +3379,8 @@ void CkLocMgr::insertRec(CkLocRec *rec,const CkArrayIndex &idx) {
        insertRecN(rec,idx);
        if (old!=NULL) {
                DEBC((AA"  replaces old rec(%s) for %s\n"AB,rec2str[old->type()],idx2str(idx)));
+       //      if(CmiMyPartition()==1)
+        //          CkPrintf("[%d][%d]replaces old rec(%s) for %s %p new type %s\n",CmiMyPartition(),CkMyPe(),rec2str[old->type()],idx2str(idx),old,rec2str[rec->type()]);
                //There was an old element at this location
                if (old->type()==CkLocRec::local && rec->type()==CkLocRec::local) {
                    if (!CkInRestarting()) {    // ok if it is restarting
@@ -3351,6 +3389,10 @@ void CkLocMgr::insertRec(CkLocRec *rec,const CkArrayIndex &idx) {
                    }
                }
                old->beenReplaced();
+                //need to remove it from homeObjHash
+               if (old->type()!=CkLocRec::local && rec->type()==CkLocRec::local) {
+                  homeObjHash.remove(*(CkArrayIndex *)&idx);
+                }
                delete old;
        }
 }
@@ -3360,6 +3402,14 @@ void CkLocMgr::insertRecN(CkLocRec *rec,const CkArrayIndex &idx) {
        DEBC((AA"  adding new rec(%s) for %s\n"AB,rec2str[rec->type()],idx2str(idx)));
         CmiImmediateLock(hashImmLock);
        hash.put(*(CkArrayIndex *)&idx)=rec;
+        if(rec->type()==CkLocRec::local){
+          //if(CmiMyPartition()==1)
+            //CkPrintf("[%d][%d] put home object %s type %s %p \n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec2str[rec->type()],rec);
+          localHash.put(*(CkArrayIndex *)&idx)=rec;
+        }
+        if(rec->type()!=CkLocRec::local&&homePe(idx)==CkMyPe()){
+          homeObjHash.put(*(CkArrayIndex *)&idx)=rec;
+        }
         CmiImmediateUnlock(hashImmLock);
 }