fixed a bug in calling ckLocal for a local chare.
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 24 Jun 2011 20:53:14 +0000 (15:53 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 24 Jun 2011 20:53:14 +0000 (15:53 -0500)
src/ck-core/ck.C
src/ck-core/ck.h

index b813684fe5b2b12542e78683860916aab168c119..63a0ac2b74d51530c18fcac93987b4c4887a4d39 100644 (file)
@@ -498,7 +498,7 @@ void *CkLocalChare(const CkChareID *pCid)
 #else
                VidBlock *v=CkpvAccess(vidblocks)[(CmiIntPtr)pCid->objPtr];
 #endif
-               return v->getLocalChare();
+               return v->getLocalChareObj();
        }
        else
        { //An ordinary chare ID
index fe4905c974ecce60366f904355ae0405f32e94d2..c26fee2ebfe6a6e45a9e8342edd0ce5e72852338 100644 (file)
@@ -65,6 +65,10 @@ inline void _CldNodeEnqueue(int node, void *msg, int infofn) {
 #define _CldNodeEnqueue   CldNodeEnqueue
 #endif
 
+#ifndef CMK_CHARE_USE_PTR
+CkpvExtern(CkVec<void *>, chare_objs);
+#endif
+
 /// A set of "Virtual ChareID"'s
 class VidBlock {
     enum VidState {FILLED, UNFILLED};
@@ -103,6 +107,16 @@ class VidBlock {
           return actualID.objPtr;
       return NULL;
     }
+    void *getLocalChareObj(void) {   
+         // returns actual object, different when CMK_CHARE_USE_PTR is false
+      if (state==FILLED && actualID.onPE==CkMyPe()) 
+#ifdef CMK_CHARE_USE_PTR
+          return actualID.objPtr;
+#else
+          return CkpvAccess(chare_objs)[(CmiIntPtr)actualID.objPtr];
+#endif
+      return NULL;
+    }
     void pup(PUP::er &p) {
 #ifndef CMK_CHARE_USE_PTR
       int s;