re-worked cksection callback. Make cksectionInfo a struct so that it can be included...
authorGengbin Zheng <gzheng@illinois.edu>
Thu, 14 Jul 2011 18:13:44 +0000 (13:13 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Thu, 14 Jul 2011 18:13:44 +0000 (13:13 -0500)
Extensive changes to avoid direct access to CkSectionInfo data members.

15 files changed:
src/ck-com/ChunkMulticastStrategy.C
src/ck-com/ComlibManager.C
src/ck-com/ComlibManager.h
src/ck-com/ComlibSectionInfo.C
src/ck-com/ComlibSectionInfo.h
src/ck-com/MulticastStrategy.C
src/ck-com/OneTimeMulticastStrategy.C
src/ck-core/charm++.h
src/ck-core/ck.C
src/ck-core/ckarray.C
src/ck-core/ckarray.h
src/ck-core/ckcallback.C
src/ck-core/ckcallback.h
src/ck-core/cksection.h
src/libs/ck-libs/multicast/ckmulticast.C

index 104cb85b87c14b042a08a70d028bb37a428e4698..be2349139f31808477adb38371192280ebbe8b0f 100644 (file)
@@ -160,7 +160,8 @@ void ChunkMulticastStrategy::localMulticast(CharmMessageHolder *cmsg) {
   double start = CmiWallTimer();
   CkSectionID *sec_id = cmsg->sec_id;
   CkVec< CkArrayIndex > localIndices;
-  sinfo.getLocalIndices(sec_id->_nElems, sec_id->_elems, sec_id->_cookie.aid, localIndices);
+  CkArrayID aid(sec_id->_cookie.get_aid());
+  sinfo.getLocalIndices(sec_id->_nElems, sec_id->_elems, aid, localIndices);
   deliverToIndices(cmsg->getCharmMessage(), localIndices.size(), localIndices.getVec() );
   //if (deliverToIndices(cmsg->getCharmMessage(), localIndices.size(), localIndices.getVec() ) == 0) 
     //CkFreeMsg(cmsg->getCharmMessage());
index 62572abb182d6533670d0ca1c551e7006d70e4dc..b7c0b520a9c79f6273c263fb9091bfe0e3529ad9 100644 (file)
@@ -1033,10 +1033,10 @@ void ComlibManager::ArraySectionSend(CkDelegateData *pd,int ep, void *m,
        CharmMessageHolder *cmsg = new CharmMessageHolder((char *)m, IS_SECTION_MULTICAST, CMH_ARRAYSECTIONSEND);
        cmsg->npes = 0;
        cmsg->sec_id = s;
-       cmsg->array_id = s->_cookie.aid;
+       cmsg->array_id = s->_cookie.get_aid();
        
 
-       msg_prepareSend_noinline((CkArrayMessage*)m, ep, s->_cookie.aid);
+       msg_prepareSend_noinline((CkArrayMessage*)m, ep, s->_cookie.get_aid());
        
        register envelope * env = UsrToEnv(m);
        env->getsetArrayIndex()= dummyArrayIndex;
@@ -1049,11 +1049,11 @@ void ComlibManager::ArraySectionSend(CkDelegateData *pd,int ep, void *m,
        
 
        CkSectionInfo minfo;
-       minfo.type = COMLIB_MULTICAST_MESSAGE;
-       minfo.sInfo.cInfo.instId = ci->getID();
+       minfo.get_type() = COMLIB_MULTICAST_MESSAGE;
+       minfo.info.sInfo.cInfo.instId = ci->getID();
        //minfo.sInfo.cInfo.status = COMLIB_MULTICAST_ALL;  
-       minfo.sInfo.cInfo.id = 0; 
-       minfo.pe = CkMyPe();
+       minfo.info.sInfo.cInfo.id = 0; 
+       minfo.get_pe() = CkMyPe();
        ((CkMcastBaseMsg *)env)->_cookie = minfo;    
        
        multicast(cmsg, instid);
@@ -1295,10 +1295,10 @@ ComlibDelegateData::ComlibDelegateData(int instid) : CkDelegateData(), _instid(i
 
 void ComlibInitSectionID(CkSectionID &sid){
 
-       sid._cookie.type = COMLIB_MULTICAST_MESSAGE;
-       sid._cookie.pe = CkMyPe();
+       sid._cookie.get_type() = COMLIB_MULTICAST_MESSAGE;
+       sid._cookie.get_pe() = CkMyPe();
 
-       sid._cookie.sInfo.cInfo.id = 0;    
+       sid._cookie.info.sInfo.cInfo.id = 0;    
        sid.npes = 0;
        sid.pelist = NULL;
 }
index 4ff5796ee22c8d4895ece9b6e845d17dc8906ff3..2edfac29e0344501750dc5d7d9639c196801b0ff 100644 (file)
@@ -218,7 +218,7 @@ void ComlibEnd(CProxy &proxy, int iteration);
     now it is used to reset a proxy before it is reassociated with another strategy. 
  */
 inline void ComlibResetSectionProxy(CProxySection_ArrayBase &sproxy) {
-  sproxy.ckGetSectionInfo().sInfo.cInfo.id = 0;
+  sproxy.ckGetSectionInfo().info.sInfo.cInfo.id = 0;
 }
 
 
index 1ebb39d17f8c0ef8052fe3ab169bdf30ec090c4b..97a35cf46296b416fbc008cc6b33178ff08eb9b3 100644 (file)
@@ -70,11 +70,11 @@ ComlibMulticastMsg * ComlibSectionInfo::getNewMulticastMessage(CharmMessageHolde
     
     ComlibMulticastMsg *msg = new(sizes, 0) ComlibMulticastMsg;
     msg->nPes = nRemotePes;
-    msg->_cookie.sInfo.cInfo.instId = instanceID;
-    msg->_cookie.sInfo.cInfo.id = MaxSectionID - 1;
-    msg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_NEW_SECTION;
-    msg->_cookie.type = COMLIB_MULTICAST_MESSAGE;
-    msg->_cookie.pe = CkMyPe();
+    msg->_cookie.info.sInfo.cInfo.instId = instanceID;
+    msg->_cookie.info.sInfo.cInfo.id = MaxSectionID - 1;
+    msg->_cookie.info.sInfo.cInfo.status = COMLIB_MULTICAST_NEW_SECTION;
+    msg->_cookie.get_type() = COMLIB_MULTICAST_MESSAGE;
+    msg->_cookie.get_pe() = CkMyPe();
 
     // fill in the three pointers of the ComlibMulticastMsg
     memcpy(msg->indicesCount, indicesCount, sizes[0] * sizeof(ComlibMulticastIndexCount));
@@ -198,15 +198,15 @@ void ComlibSectionInfo::processOldSectionMessage(CharmMessageHolder *cmsg) {
 
     //Old section id, send the id with the message
     CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)cmsg->getCharmMessage();
-    cbmsg->_cookie.pe = CkMyPe();
-    cbmsg->_cookie.sInfo.cInfo.id = cur_sec_id;
-    cbmsg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_OLD_SECTION;
+    cbmsg->_cookie.get_pe() = CkMyPe();
+    cbmsg->_cookie.info.sInfo.cInfo.id = cur_sec_id;
+    cbmsg->_cookie.info.sInfo.cInfo.status = COMLIB_MULTICAST_OLD_SECTION;
 }
 
 CkMcastBaseMsg *ComlibSectionInfo::getNewDeliveryErrorMsg(CkMcastBaseMsg *base) {
   CkMcastBaseMsg *dest= (CkMcastBaseMsg*)CkAllocMsg(0, sizeof(CkMcastBaseMsg), 0);
   memcpy(dest, base, sizeof(CkMcastBaseMsg));
-  dest->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_SECTION_ERROR;
+  dest->_cookie.info.sInfo.cInfo.status = COMLIB_MULTICAST_SECTION_ERROR;
   return dest;
 }
 
index 6140c6be0e5e605899d7cb02c6530521c9cf2017..9cfc1361a41dbe0ad93765e3abc5f2d498e1295d 100644 (file)
@@ -136,9 +136,9 @@ class ComlibSectionInfo {
         CkAbort("Too many sections allocated, wrapping of ints should be done!\n");
       }
       ComlibPrintf("[%d] ComlibSectionInfo::initSectionID: creating section number %d for proc %d\n",
-          CkMyPe(), MaxSectionID, sid->_cookie.pe);
-      sid->_cookie.sInfo.cInfo.id = MaxSectionID ++;
-      sid->_cookie.pe = CkMyPe();
+          CkMyPe(), MaxSectionID, sid->_cookie.get_pe());
+      sid->_cookie.info.sInfo.cInfo.id = MaxSectionID ++;
+      sid->_cookie.get_pe() = CkMyPe();
     }
     
     void processOldSectionMessage(CharmMessageHolder *cmsg);
index 62a68fcd0764dffd41c1e088e1e2bae9d62f550a..6ec70a0a9808dbc048fe58a8f37c0ed2aac4cf3f 100644 (file)
@@ -91,7 +91,7 @@ void MulticastStrategy::insertMessage(CharmMessageHolder *cmsg){
       ComlibPrintf("Array section id was %d, but now is %d\n", cur_sec_id, sid->getSectionID());
       CkAssert(cur_sec_id == sid->getSectionID());
 
-      ComlibPrintf("[%d] Comlib Section Multicast: insertMessage: cookiePE=%d\n",CkMyPe(),sid->_cookie.pe);
+      ComlibPrintf("[%d] Comlib Section Multicast: insertMessage: cookiePE=%d\n",CkMyPe(),sid->_cookie.get_pe());
       ComlibSectionHashKey key(CkMyPe(), cur_sec_id);
       ComlibSectionHashObject *obj = sec_ht.get(key);
 
@@ -114,7 +114,7 @@ void MulticastStrategy::insertMessage(CharmMessageHolder *cmsg){
        * destination processor might find an "obj", created by somebody else. This "obj"
        * is accepted only if the current processor is equal to the processor in which the
        * cookie ID was defined. */
-      if (obj != NULL && CkMyPe() == sid->_cookie.pe && !obj->isOld) {
+      if (obj != NULL && CkMyPe() == sid->_cookie.get_pe() && !obj->isOld) {
        envelope *env = UsrToEnv(cmsg->getCharmMessage());
        localMulticast(env, obj, (CkMcastBaseMsg*)cmsg->getCharmMessage());
        remoteMulticast(env, obj);
@@ -145,10 +145,10 @@ void MulticastStrategy::insertMessage(CharmMessageHolder *cmsg){
       envelope *newenv = UsrToEnv(newmsg);
       CkPackMessage(&newenv);
     
-      ComlibSectionHashKey key(CkMyPe(), sid->_cookie.sInfo.cInfo.id);        
+      ComlibSectionHashKey key(CkMyPe(), sid->_cookie.info.sInfo.cInfo.id);        
     
       obj = sec_ht.get(key);
-      ComlibPrintf("[%d] looking up key sid->_cookie.sInfo.cInfo.id=%d. Found obj=%p\n", CkMyPe(), (int)sid->_cookie.sInfo.cInfo.id, obj);
+      ComlibPrintf("[%d] looking up key sid->_cookie.sInfo.cInfo.id=%d. Found obj=%p\n", CkMyPe(), (int)sid->_cookie.info.sInfo.cInfo.id, obj);
       CkAssert(obj_inserted == obj);
     
 
@@ -180,24 +180,25 @@ void MulticastStrategy::insertMessage(CharmMessageHolder *cmsg){
 ComlibSectionHashObject * MulticastStrategy::insertSectionID(CkSectionID *sid, int npes, ComlibMulticastIndexCount* pelist) {
 
   ComlibPrintf("[%d] MulticastStrategy:insertSectionID\n",CkMyPe());
-  ComlibPrintf("[%d] MulticastStrategy:insertSectionID  sid->_cookie.sInfo.cInfo.id=%d \n",CkMyPe(),  (int)sid->_cookie.sInfo.cInfo.id);
+  ComlibPrintf("[%d] MulticastStrategy:insertSectionID  sid->_cookie.sInfo.cInfo.id=%d \n",CkMyPe(),  (int)sid->_cookie.info.sInfo.cInfo.id);
 
   //   double StartTime = CmiWallTimer();
 
-  ComlibSectionHashKey key(CkMyPe(), sid->_cookie.sInfo.cInfo.id);
+  ComlibSectionHashKey key(CkMyPe(), sid->_cookie.info.sInfo.cInfo.id);
 
   ComlibSectionHashObject *obj = NULL;    
   obj = sec_ht.get(key);
     
   if(obj != NULL) {
     ComlibPrintf("MulticastStrategy:insertSectionID: Deleting old object on proc %d for id %d\n",
-                CkMyPe(), sid->_cookie.sInfo.cInfo.id);
+                CkMyPe(), sid->_cookie.info.sInfo.cInfo.id);
     delete obj;
   }
 
   ComlibPrintf("[%d] Creating new ComlibSectionHashObject in insertSectionID\n", CkMyPe());
   obj = new ComlibSectionHashObject();
-  sinfo.getLocalIndices(sid->_nElems, sid->_elems, sid->_cookie.aid, obj->indices);
+  CkArrayID aid(sid->_cookie.get_aid());
+  sinfo.getLocalIndices(sid->_nElems, sid->_elems, aid, obj->indices);
     
   createObjectOnSrcPe(obj, npes, pelist);
   sec_ht.put(key) = obj;
@@ -311,7 +312,7 @@ void MulticastStrategy::handleMessage(void *msg){
   CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)EnvToUsr(env);
   if (cbmsg->magic != _SECTION_MAGIC) CkAbort("MulticastStrategy received bad message! Did you forget to inherit from CkMcastBaseMsg?\n");
     
-  int status = cbmsg->_cookie.sInfo.cInfo.status;
+  int status = cbmsg->_cookie.info.sInfo.cInfo.status;
   ComlibPrintf("[%d] In handleMulticastMessage %d\n", CkMyPe(), status);
     
   if(status == COMLIB_MULTICAST_NEW_SECTION)
@@ -321,8 +322,8 @@ void MulticastStrategy::handleMessage(void *msg){
     // old. next time we try to use it, a new one will be generated with the
     // updated inforamtion in the location manager (since the wrong delivery
     // updated it indirectly.
-    ComlibSectionHashKey key(cbmsg->_cookie.pe
-                            cbmsg->_cookie.sInfo.cInfo.id);    
+    ComlibSectionHashKey key(cbmsg->_cookie.get_pe()
+                            cbmsg->_cookie.info.sInfo.cInfo.id);    
         
     ComlibSectionHashObject *obj;
     obj = sec_ht.get(key);
@@ -334,8 +335,8 @@ void MulticastStrategy::handleMessage(void *msg){
     obj->isOld = 1;
   } else if (status == COMLIB_MULTICAST_OLD_SECTION) {
     //status == COMLIB_MULTICAST_OLD_SECTION, use the cached section id
-    ComlibSectionHashKey key(cbmsg->_cookie.pe
-                            cbmsg->_cookie.sInfo.cInfo.id);    
+    ComlibSectionHashKey key(cbmsg->_cookie.get_pe()
+                            cbmsg->_cookie.info.sInfo.cInfo.id);    
         
     ComlibSectionHashObject *obj;
     obj = sec_ht.get(key);
@@ -371,8 +372,8 @@ void MulticastStrategy::handleNewMulticastMessage(envelope *env) {
   sinfo.unpack(env, localElems, local_idx_list, newenv);
 
   ComlibMulticastMsg *cbmsg = (ComlibMulticastMsg *)EnvToUsr(env);
-  ComlibSectionHashKey key(cbmsg->_cookie.pe
-                          cbmsg->_cookie.sInfo.cInfo.id);
+  ComlibSectionHashKey key(cbmsg->_cookie.get_pe()
+                          cbmsg->_cookie.info.sInfo.cInfo.id);
     
   ComlibSectionHashObject *old_obj = NULL;
     
@@ -392,7 +393,7 @@ void MulticastStrategy::handleNewMulticastMessage(envelope *env) {
   new_obj->indices.resize(0);
   for (int i=0; i<localElems; ++i) new_obj->indices.insertAtEnd(local_idx_list[i]);
     
-  createObjectOnIntermediatePe(new_obj, cbmsg->nPes, cbmsg->indicesCount, cbmsg->_cookie.pe);
+  createObjectOnIntermediatePe(new_obj, cbmsg->nPes, cbmsg->indicesCount, cbmsg->_cookie.get_pe());
 
   ComlibPrintf("[%d] Inserting object into sec_ht\n", CkMyPe());
   ComlibPrintf("[%d] sec_ht.numObjects() =%d\n", CkMyPe(), sec_ht.numObjects());
index 42f0e6afdde5a1faefb12c214f78a13d177b82dd..6e65c7b86c9bfaeb2be3527f8ca54762acca3391 100644 (file)
@@ -87,7 +87,8 @@ void OneTimeMulticastStrategy::localMulticast(CharmMessageHolder *cmsg) {
   double start = CmiWallTimer();
   CkSectionID *sec_id = cmsg->sec_id;
   CkVec< CkArrayIndex > localIndices;
-  sinfo.getLocalIndices(sec_id->_nElems, sec_id->_elems, sec_id->_cookie.aid, localIndices);
+  CkArrayID aid(sec_id->_cookie.get_aid());
+  sinfo.getLocalIndices(sec_id->_nElems, sec_id->_elems, aid, localIndices);
   deliverToIndices(cmsg->getCharmMessage(), localIndices );
   traceUserBracketEvent(10000, start, CmiWallTimer());
 }
@@ -113,7 +114,7 @@ void OneTimeMulticastStrategy::remoteMulticast(ComlibMulticastMsg * multMsg, boo
   
   // Find my index in the list of all destination PEs
   if(rootPE){
-    CkAssert(CkMyPe() == multMsg->_cookie.pe);
+    CkAssert(CkMyPe() == multMsg->_cookie.get_pe());
     myIndex = -1;
   } else {
     for (int i=0; i<totalDestPEs; ++i) {
@@ -132,7 +133,7 @@ void OneTimeMulticastStrategy::remoteMulticast(ComlibMulticastMsg * multMsg, boo
 
   if(totalDestPEs > 0) {
     //CkPrintf("totalDestPEs = %d\n", totalDestPEs);
-    determineNextHopPEs(totalDestPEs, multMsg->indicesCount, myIndex, multMsg->_cookie.pe, pelist, npes );
+    determineNextHopPEs(totalDestPEs, multMsg->indicesCount, myIndex, multMsg->_cookie.get_pe(), pelist, npes );
   } else {
     npes = 0;
   }
index 56537496f246018a365fce57285e2449503293b5..a1ba7c7d90acbe9a88cbd14c3ae146b18b9d3c03 100644 (file)
@@ -839,7 +839,7 @@ public:
   inline CkSectionID *ckGetSectionIDs() {return _sid; }
   inline CkSectionID &ckGetSectionID() {return _sid[0]; }
   inline CkSectionID &ckGetSectionID(int i) {return _sid[i]; }
-  inline CkGroupID ckGetGroupIDn(int i) const {return (CkGroupID)_sid[i]._cookie.aid;}
+  inline CkGroupID ckGetGroupIDn(int i) const {return (CkGroupID)_sid[i]._cookie.info.aid;}
   inline int *ckGetElements() const {return _sid[0].pelist;}
   inline int *ckGetElements(int i) const {return _sid[i].pelist;}
   inline int ckGetNumElements() const { return _sid[0].npes; }
index 63a0ac2b74d51530c18fcac93987b4c4887a4d39..6c8fd0ca325e0f17a68760888792d90f31b00c47 100644 (file)
@@ -170,7 +170,6 @@ void Chare::CkAddThreadListeners(CthThread th, void *msg) {
   traceAddThreadListeners(th, UsrToEnv(msg));
 }
 
-
 void CkMessage::ckDebugPup(PUP::er &p,void *msg) {
   p.comment("Bytes");
   int ts=UsrToEnv(msg)->getTotalsize();
@@ -246,13 +245,13 @@ void CkDelegateMgr::GroupSend(CkDelegateData *pd,int ep,void *m,int onPE,CkGroup
 void CkDelegateMgr::GroupBroadcast(CkDelegateData *pd,int ep,void *m,CkGroupID g)
   { CkBroadcastMsgBranch(ep,m,g); }
 void CkDelegateMgr::GroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s)
-  { CkSendMsgBranchMulti(ep,m,s->_cookie.aid,s->npes,s->pelist); }
+  { CkSendMsgBranchMulti(ep,m,s->_cookie.get_aid(),s->npes,s->pelist); }
 void CkDelegateMgr::NodeGroupSend(CkDelegateData *pd,int ep,void *m,int onNode,CkNodeGroupID g)
   { CkSendMsgNodeBranch(ep,m,onNode,g); }
 void CkDelegateMgr::NodeGroupBroadcast(CkDelegateData *pd,int ep,void *m,CkNodeGroupID g)
   { CkBroadcastMsgNodeBranch(ep,m,g); }
 void CkDelegateMgr::NodeGroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s)
-  { CkSendMsgNodeBranchMulti(ep,m,s->_cookie.aid,s->npes,s->pelist); }
+  { CkSendMsgNodeBranchMulti(ep,m,s->_cookie.get_aid(),s->npes,s->pelist); }
 void CkDelegateMgr::ArrayCreate(CkDelegateData *pd,int ep,void *m,const CkArrayIndex &idx,int onPE,CkArrayID a)
 {
        CProxyElement_ArrayBase ap(a,idx);
@@ -354,7 +353,7 @@ void CProxy::pup(PUP::er &p) {
 /**** Array sections */
 #define CKSECTIONID_CONSTRUCTOR_DEF(index) \
 CkSectionID::CkSectionID(const CkArrayID &aid, const CkArrayIndex##index *elems, const int nElems): _nElems(nElems) { \
-  _cookie.aid = aid;   \
+  _cookie.get_aid() = aid;     \
   _cookie.get_pe() = CkMyPe(); \
   _elems = new CkArrayIndex[nElems];   \
   for (int i=0; i<nElems; i++) _elems[i] = elems[i];   \
@@ -373,7 +372,7 @@ CKSECTIONID_CONSTRUCTOR_DEF(Max)
 CkSectionID::CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes): _nElems(0), _elems(NULL), npes(_npes) {
   pelist = new int[npes];
   for (int i=0; i<npes; i++) pelist[i] = _pelist[i];
-  _cookie.aid = gid;
+  _cookie.get_aid() = gid;
 }
 
 CkSectionID::CkSectionID(const CkSectionID &sid) {
index 895d4be18ac161be53f4112b5de2af6e91ee50f6..95ba32fea209949e6895646b097c431b8bf0c20e 100644 (file)
@@ -1007,13 +1007,13 @@ void CProxySection_ArrayBase::ckSend(CkArrayMessage *msg, int ep, int opts)
          // send through all
          for (int k=0; k<_nsid; ++k) {
            for (int i=0; i< _sid[k]._nElems-1; i++) {
-             CProxyElement_ArrayBase ap(_sid[k]._cookie.aid, _sid[k]._elems[i]);
+             CProxyElement_ArrayBase ap(_sid[k]._cookie.get_aid(), _sid[k]._elems[i]);
              void *newMsg=CkCopyMsg((void **)&msg);
              ap.ckSend((CkArrayMessage *)newMsg,ep,opts);
            }
            if (_sid[k]._nElems > 0) {
              void *newMsg= (k<_nsid-1) ? CkCopyMsg((void **)&msg) : msg;
-             CProxyElement_ArrayBase ap(_sid[k]._cookie.aid, _sid[k]._elems[_sid[k]._nElems-1]);
+             CProxyElement_ArrayBase ap(_sid[k]._cookie.get_aid(), _sid[k]._elems[_sid[k]._nElems-1]);
              ap.ckSend((CkArrayMessage *)newMsg,ep,opts);
            }
          }
index 3f60a3059085b430641e29de9f69f1fe440ef118..07ec971f31c43bbcebf74b24a1b408054a807e6f 100644 (file)
@@ -383,9 +383,9 @@ public:
                const CkArrayIndex *elems, const int nElems, CK_DELCTOR_PARAM)
                :CProxy_ArrayBase(aid,CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(aid, elems, nElems); }
        CProxySection_ArrayBase(const CkSectionID &sid)
-               :CProxy_ArrayBase(sid._cookie.aid), _nsid(1) { _sid = new CkSectionID(sid); }
+               :CProxy_ArrayBase(sid._cookie.get_aid()), _nsid(1) { _sid = new CkSectionID(sid); }
        CProxySection_ArrayBase(const CkSectionID &sid, CK_DELCTOR_PARAM)
-               :CProxy_ArrayBase(sid._cookie.aid, CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(sid); }
+               :CProxy_ArrayBase(sid._cookie.get_aid(), CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(sid); }
         CProxySection_ArrayBase(const CProxySection_ArrayBase &cs)
                :CProxy_ArrayBase(cs.ckGetArrayID()), _nsid(cs._nsid) {
       if (_nsid == 1) _sid = new CkSectionID(cs.ckGetArrayID(), cs.ckGetArrayElements(), cs.ckGetNumElements());
@@ -446,7 +446,7 @@ public:
        inline CkSectionID *ckGetSectionIDs() {return _sid;}
        inline CkSectionID &ckGetSectionID() {return _sid[0];}
        inline CkSectionID &ckGetSectionID(int i) {return _sid[i];}
-       inline CkArrayID ckGetArrayIDn(int i) const {return _sid[i]._cookie.aid;}
+       inline CkArrayID ckGetArrayIDn(int i) const {return _sid[i]._cookie.get_aid();}
     inline CkArrayIndex *ckGetArrayElements() const {return _sid[0]._elems;}
     inline CkArrayIndex *ckGetArrayElements(int i) const {return _sid[i]._elems;}
     inline int ckGetNumElements() const { return _sid[0]._nElems; }
index 57b4a4360f5bf5441a172dc8bdd76cbd8ea47e65..1b0b23be0d3d7480d97c96c3efc2aa63e6f8ad2b 100644 (file)
@@ -147,8 +147,15 @@ CkCallback::CkCallback(int ep,CProxySection_ArrayBase &sectElt,CmiBool doInline)
       bzero(this, sizeof(CkCallback));
 #endif
       type=bcastSection;
-       d.array.ep=ep; 
-       secID=sectElt.ckGetSectionID(0); 
+      d.section.ep=ep; 
+      CkSectionID secID=sectElt.ckGetSectionID(0); 
+      d.section.sinfo = secID._cookie.info;
+      d.section._elems = secID._elems;
+      d.section._nElems = secID._nElems;
+      d.section.pelist = secID.pelist;
+      d.section.npes = secID.npes;
+      secID._elems = NULL;
+      secID.pelist = NULL;
 }
 
 CkCallback::CkCallback(int ep, CkSectionID &id) {
@@ -157,7 +164,11 @@ CkCallback::CkCallback(int ep, CkSectionID &id) {
 #endif
       type=bcastSection;
       d.section.ep=ep;
-      secID=id;
+      d.section.sinfo = id._cookie.info;
+      d.section._elems = id._elems;
+      d.section._nElems = id._nElems;
+      d.section.pelist = id.pelist;
+      d.section.npes = id.npes;
 }
 
 CkCallback::CkCallback(ArrayElement *p, int ep,CmiBool doInline) {
@@ -256,10 +267,15 @@ void CkCallback::send(void *msg) const
                if (!msg) msg=CkAllocSysMsg();
                CkBroadcastMsgArray(d.array.ep,msg,d.array.id);
                break;
-       case bcastSection:
+       case bcastSection: {
                if(!msg)msg=CkAllocSysMsg();
+                CkSectionInfo sinfo(d.section.sinfo);
+                CkSectionID secID(sinfo, d.section._elems, d.section._nElems, d.section.pelist, d.section.npes);
                CkBroadcastMsgSection(d.section.ep,msg,secID);
+                secID._elems = NULL;
+                secID.pelist = NULL;
                break;
+             }
        case replyCCS: { /* Send CkDataMsg as a CCS reply */
                void *data=NULL;
                int length=0;
index cf97296e35b9bb2788b5f5e0ccf327085d54374d..5c5ada215cf19529d716e4d0d1969cc615e8430d 100644 (file)
@@ -80,6 +80,11 @@ private:
                CkArrayIndexBase idx; //Index to send to (if any)
        } array;
        struct s_section{
+               CkSectionInfoStruct sinfo;
+                CkArrayIndex *_elems;
+                int _nElems;
+                int *pelist;
+                int npes;
                int ep;
        } section;
 
@@ -94,7 +99,6 @@ private:
 public:        
        callbackType type;
        callbackData d;
-       CkSectionID secID;
        void impl_thread_init(void);
        void *impl_thread_delay(void) const;
 
@@ -214,6 +218,10 @@ public:
 
        ~CkCallback() {
          thread_destroy();
+          if (bcastSection == type) {
+            if (d.section._elems != NULL) delete [] d.section._elems;
+            if (d.section.pelist != NULL) delete [] d.section.pelist;
+          }
        }
        
        int isInvalid(void) const {return type==invalid;}
index 06a7a56438d13d8e59f08f30756d2dab8ab2c81e..34709c3a2df02c7badee357b9e1d97365dff9011 100644 (file)
 
 /** Structure that holds info relevant to the use of an array/group section
  */
-class CkSectionInfo {
- public:
+typedef struct _CkSectionInfoStruct {
     /// The array ID of the array that has been sectioned
-    CkArrayID aid; ///< @note: Also used to store a CkGroupID for group multicasts
+    CkGroupID aid; ///< @note: Also used to store a CkGroupID for group multicasts
     /// The pe on which this object has been created
     int pe;
     /// Info needed by the section comm managers
@@ -60,50 +59,61 @@ class CkSectionInfo {
     } sInfo;
     // Indicates which library has been delegated the section comm
     char type;
+} CkSectionInfoStruct;
+
+class CkSectionInfo {
+ public:
+    CkSectionInfoStruct  info;
     
     CkSectionInfo()  {
-        type = 0; pe = -1;
-        sInfo.sCookie.val=NULL; sInfo.sCookie.redNo=0;
-        sInfo.cInfo.instId = 0;
-        sInfo.cInfo.status = 0;
-        sInfo.cInfo.id     = 0;
+        info.type = 0; info.pe = -1;
+        info.sInfo.sCookie.val=NULL; info.sInfo.sCookie.redNo=0;
+        info.sInfo.cInfo.instId = 0;
+        info.sInfo.cInfo.status = 0;
+        info.sInfo.cInfo.id     = 0;
     }
 
+    CkSectionInfo(CkSectionInfoStruct i): info(i) {}
+
     CkSectionInfo(int t) {
-      type = t; pe = -1;
-      switch (type) {
+      info.type = t; info.pe = -1;
+      switch (info.type) {
       case MulticastMsg:
-        sInfo.sCookie.val=NULL; 
-        sInfo.sCookie.redNo=0;
+        info.sInfo.sCookie.val=NULL; 
+        info.sInfo.sCookie.redNo=0;
         break;
       case COMLIB_MULTICAST_MESSAGE:
-        sInfo.cInfo.instId=0;
-        sInfo.cInfo.status=0;
-        sInfo.cInfo.id=0;
+        info.sInfo.cInfo.instId=0;
+        info.sInfo.cInfo.status=0;
+        info.sInfo.cInfo.id=0;
         break;
       default:
         CmiAssert(0);
       }
     }
 
-    CkSectionInfo(CkArrayID _aid, void *p = NULL): pe(CkMyPe()),
-    type(MulticastMsg) {
-      aid = _aid;
-      sInfo.sCookie.val=p;
-      sInfo.sCookie.redNo=0;
+    CkSectionInfo(CkArrayID _aid, void *p = NULL) {
+      info.type = MulticastMsg;
+      info.pe = CkMyPe();
+      info.aid = _aid;
+      info.sInfo.sCookie.val=p;
+      info.sInfo.sCookie.redNo=0;
     }
 
     CkSectionInfo(int e, void *p, int r, CkArrayID _aid) {
-      type = MulticastMsg;
-      pe = e; 
-      aid = _aid;
-      sInfo.sCookie.val=p;
-      sInfo.sCookie.redNo=r;
+      info.type = MulticastMsg;
+      info.pe = e; 
+      info.aid = _aid;
+      info.sInfo.sCookie.val=p;
+      info.sInfo.sCookie.redNo=r;
     }
 
-    inline int   &get_pe()    { return pe; }
-    inline int   &get_redNo() { CmiAssert(type==MulticastMsg); return sInfo.sCookie.redNo; }
-    inline void* &get_val()   { CmiAssert(type==MulticastMsg); return sInfo.sCookie.val; }
+    inline char  &get_type() { return info.type; }
+    inline int   &get_pe()    { return info.pe; }
+    inline int   &get_redNo() { CmiAssert(info.type==MulticastMsg); return info.sInfo.sCookie.redNo; }
+    inline void* &get_val()   { CmiAssert(info.type==MulticastMsg); return info.sInfo.sCookie.val; }
+    inline CkGroupID   &get_aid()    { return info.aid; }
+    inline CkGroupID   get_aid() const   { return info.aid; }
 
     /*
     void pup(PUP::er &p) {
@@ -186,6 +196,7 @@ class CkSectionID {
         
         CkSectionID(): _elems(NULL), _nElems(0), pelist(0), npes(0) {}
         CkSectionID(const CkSectionID &sid);
+        CkSectionID(CkSectionInfo &c, CkArrayIndex *e, int n, int *_pelist, int _npes): _cookie(c), _elems(e), _nElems(n), pelist(_pelist), npes(_npes)  {}
         CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes);
         CKSECTIONID_CONSTRUCTOR(1D)
         CKSECTIONID_CONSTRUCTOR(2D)
@@ -195,7 +206,7 @@ class CkSectionID {
         CKSECTIONID_CONSTRUCTOR(6D)
         CKSECTIONID_CONSTRUCTOR(Max)
 
-        inline int getSectionID(){ return _cookie.sInfo.cInfo.id; }
+        inline int getSectionID(){ return _cookie.info.sInfo.cInfo.id; }
         void operator=(const CkSectionID &);
         ~CkSectionID() {
             if (_elems != NULL) delete [] _elems;
index 898fe468175d49f7f7dcef5fdfaf38112e966eee..55c2b3846d0721b26deae95740a3f26f9be6455d 100644 (file)
@@ -21,7 +21,7 @@
 #define DEBUGF(x)  // CkPrintf x;
 
 // turn on or off fragmentation in multicast
-#define SPLIT_MULTICAST  0 
+#define SPLIT_MULTICAST  0
 // each multicast message is split into SPLIT_NUM fragments
 #define SPLIT_NUM 20
 #define SPLIT_SIZE (250000)
@@ -264,7 +264,7 @@ void CkMulticastMgr::setSection(CkSectionInfo &_id, CkArrayID aid, CkArrayIndex
 #endif
     }
     //  entry->aid = aid;
-    _id.aid = aid;
+    _id.get_aid() = aid;
     _id.get_val() = entry;             // allocate table for this section
     // 
     initCookie(_id);
@@ -297,8 +297,8 @@ void CkMulticastMgr::setSection(CProxySection_ArrayElement &proxy)
     entry->allObjKeys.push_back(key);
 #endif
   }
-  _id.type = MulticastMsg;
-  _id.aid = aid;
+  _id.get_type() = MulticastMsg;
+  _id.get_aid() = aid;
   _id.get_val() = entry;               // allocate table for this section
   initCookie(_id);
 }
@@ -321,7 +321,7 @@ void CkMulticastMgr::resetSection(CProxySection_ArrayElement &proxy)
   DEBUGF(("[%d] resetSection: old entry:%p new entry:%p\n", CkMyPe(), oldentry, entry));
 
   const CkArrayIndex *al = sid->_elems;
-  CmiAssert(info.aid == aid);
+  CmiAssert(info.get_aid() == aid);
   prepareCookie(entry, *sid, al, sid->_nElems, aid);
 
   CProxy_CkMulticastMgr  mCastGrp(thisgroup);
@@ -349,8 +349,8 @@ void CkMulticastMgr::prepareCookie(mCastEntry *entry, CkSectionID &sid, const Ck
     entry->allObjKeys.push_back(key);
 #endif
   }
-  sid._cookie.type = MulticastMsg;
-  sid._cookie.aid = aid;
+  sid._cookie.get_type() = MulticastMsg;
+  sid._cookie.get_aid() = aid;
   sid._cookie.get_val() = entry;       // allocate table for this section
   sid._cookie.get_pe() = CkMyPe();
 }
@@ -411,7 +411,7 @@ void CkMulticastMgr::initCookie(CkSectionInfo s)
     msg->rootSid = s;
     msg->redNo = entry->red.redNo;
     // Fill the message with the section member indices and their last known locations
-    CkArray *array = CProxy_ArrayBase(s.aid).ckLocalBranch();
+    CkArray *array = CProxy_ArrayBase(s.get_aid()).ckLocalBranch();
     for (int i=0; i<n; i++) {
       msg->arrIdx[i] = entry->allElem[i];
       int ape = array->lastKnown(entry->allElem[i]);
@@ -487,7 +487,7 @@ void CkMulticastMgr::setup(multicastSetupMsg *msg)
 {
     int i,j;
     mCastEntry *entry;
-    CkArrayID aid = msg->rootSid.aid;
+    CkArrayID aid = msg->rootSid.get_aid();
     if (msg->parent.get_pe() == CkMyPe()) 
       entry = (mCastEntry *)msg->rootSid.get_val(); //sid.val;
     else 
@@ -745,14 +745,14 @@ void CkMulticastMgr::sendToSection(CkDelegateData *pd,int ep,void *m, CkSectionI
 #if CMK_LBDB_ON
     // fixme: running obj?
     envelope *env = UsrToEnv(msg);
-    const LDOMHandle &om = CProxy_ArrayBase(s.aid).ckLocMgr()->getOMHandle();
+    const LDOMHandle &om = CProxy_ArrayBase(s.get_aid()).ckLocMgr()->getOMHandle();
     LBDatabaseObj()->MulticastSend(om,entry->allObjKeys.getVec(),entry->allObjKeys.size(),env->getTotalsize());
 #endif
 
     // first time need to rebuild, we do simple send to refresh lastKnown
     if (entry->needRebuild == 1) {
       msg->_cookie = s;
-      SimpleSend(ep, msg, s.aid, *sid, opts);
+      SimpleSend(ep, msg, s.get_aid(), *sid, opts);
       entry->needRebuild = 2;
       return;
     }
@@ -866,7 +866,7 @@ void CkMulticastMgr::recvMsg(multicastGrpMsg *msg)
   int i;
   CkSectionInfo &sectionInfo = msg->_cookie;
   mCastEntry *entry = (mCastEntry *)msg->_cookie.get_val();
-  CmiAssert(entry->getAid() == sectionInfo.aid);
+  CmiAssert(entry->getAid() == sectionInfo.get_aid());
 
 #if ! SPLIT_MULTICAST
   if (entry->notReady()) {
@@ -889,9 +889,9 @@ void CkMulticastMgr::recvMsg(multicastGrpMsg *msg)
   int nLocal = entry->localElem.length();
   DEBUGF(("send to local %d\n", nLocal));
   for (i=0; i<nLocal-1; i++) {
-    CProxyElement_ArrayBase ap(sectionInfo.aid, entry->localElem[i]);
+    CProxyElement_ArrayBase ap(sectionInfo.get_aid(), entry->localElem[i]);
     if (_entryTable[msg->ep]->noKeep) {
-      CkSendMsgArrayInline(msg->ep, msg, sectionInfo.aid, entry->localElem[i], CK_MSG_KEEP);
+      CkSendMsgArrayInline(msg->ep, msg, sectionInfo.get_aid(), entry->localElem[i], CK_MSG_KEEP);
     }
     else {
       // send through scheduler queue
@@ -906,7 +906,7 @@ void CkMulticastMgr::recvMsg(multicastGrpMsg *msg)
     //CmiNetworkProgressAfter(3);
   }
   if (nLocal) {
-    CProxyElement_ArrayBase ap(sectionInfo.aid, entry->localElem[nLocal-1]);
+    CProxyElement_ArrayBase ap(sectionInfo.get_aid(), entry->localElem[nLocal-1]);
     ap.ckSend((CkArrayMessage *)msg, msg->ep, CK_MSG_LB_NOTRACE);
 //    CkSendMsgArrayInline(msg->ep, msg, msg->aid, entry->localElem[nLocal-1]);
   }
@@ -927,7 +927,7 @@ void CkGetSectionInfo(CkSectionInfo &id, void *msg)
   }
   // ignore invalid cookie sent by SimpleSend
   if (m->gpe() != -1) {
-    id.type = MulticastMsg;
+    id.get_type() = MulticastMsg;
     id.get_pe() = m->gpe();
     id.get_val() = m->cookie();
   }