Array section helper classes
[charm.git] / src / ck-com / ComlibSectionInfo.C
1
2 #include "ComlibManager.h"
3 #include "ComlibSectionInfo.h"
4
5 ComlibMulticastMsg * ComlibSectionInfo::getNewMulticastMessage
6 (CharmMessageHolder *cmsg){
7     
8     if(cmsg->sec_id == NULL || cmsg->sec_id->_nElems == 0)
9         return NULL;
10
11     void *m = cmsg->getCharmMessage();
12     envelope *env = UsrToEnv(m);
13     
14     if(cmsg->sec_id->_cookie.sInfo.cInfo.id != 0) 
15         CmiAbort("In correct section\n");
16
17     CkPackMessage(&env);
18     int sizes[2];
19     sizes[0] = cmsg->sec_id->_nElems;
20     sizes[1] = env->getTotalsize();                
21     
22     cmsg->sec_id->_cookie.sInfo.cInfo.id = MaxSectionID ++;
23     
24     ComlibPrintf("Creating new comlib multicast message %d, %d\n", sizes[0], sizes[1]);
25     
26     ComlibMulticastMsg *msg = new(sizes, 0) ComlibMulticastMsg;
27     msg->nIndices = cmsg->sec_id->_nElems;
28     msg->_cookie.sInfo.cInfo.instId = instanceID;
29     msg->_cookie.sInfo.cInfo.id = MaxSectionID - 1;
30     msg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_NEW_SECTION;
31     msg->_cookie.type = COMLIB_MULTICAST_MESSAGE;
32     msg->_cookie.pe = CkMyPe();
33     
34     memcpy(msg->indices, cmsg->sec_id->_elems, 
35            sizes[0] * sizeof(CkArrayIndexMax));
36     memcpy(msg->usrMsg, env, sizes[1] * sizeof(char));         
37     envelope *newenv = UsrToEnv(msg);
38     
39     newenv->getsetArrayMgr() = env->getsetArrayMgr();
40     newenv->getsetArraySrcPe() = env->getsetArraySrcPe();
41     newenv->getsetArrayEp() = env->getsetArrayEp();
42     newenv->getsetArrayHops() = env->getsetArrayHops();
43     newenv->getsetArrayIndex() = env->getsetArrayIndex();
44
45     // for trace projections
46     newenv->setEvent(env->getEvent());
47     newenv->setSrcPe(env->getSrcPe());
48     
49     CkPackMessage(&newenv);        
50     return (ComlibMulticastMsg *)EnvToUsr(newenv);
51
52     return NULL;
53 }
54
55 void ComlibSectionInfo::unpack(envelope *cb_env, 
56                                CkVec<CkArrayIndexMax> *&dest_indices, 
57                                envelope *&env) {
58     
59     dest_indices = new CkVec<CkArrayIndexMax>;
60     
61     ComlibMulticastMsg *ccmsg = (ComlibMulticastMsg *)EnvToUsr(cb_env);
62     for(int count = 0; count < ccmsg->nIndices; count++){
63         CkArrayIndexMax idx = ccmsg->indices[count];
64         int dest_proc = CkArrayID::CkLocalBranch(destArrayID)->lastKnown(idx);
65         
66         if(dest_proc == CkMyPe())
67             dest_indices->insertAtEnd(idx);                        
68     }            
69     
70     envelope *usrenv = (envelope *) ccmsg->usrMsg;
71     env = (envelope *)CmiAlloc(usrenv->getTotalsize());
72     memcpy(env, ccmsg->usrMsg, usrenv->getTotalsize());
73 }
74
75
76 void ComlibSectionInfo::processOldSectionMessage(CharmMessageHolder *cmsg) {
77     int cur_sec_id = ComlibSectionInfo::getSectionID(*cmsg->sec_id);
78
79     //Old section id, send the id with the message
80     CkMcastBaseMsg *cbmsg = (CkMcastBaseMsg *)cmsg->getCharmMessage();
81     cbmsg->_cookie.sInfo.cInfo.id = cur_sec_id;
82     cbmsg->_cookie.sInfo.cInfo.status = COMLIB_MULTICAST_OLD_SECTION;
83 }
84
85 void ComlibSectionInfo::initSectionID(CkSectionID *sid){
86     
87     if(sid->npes > 0) 
88         return;
89
90     sid->pelist = new int[CkNumPes()];
91     sid->npes = 0;
92     
93     int count = 0, acount = 0;
94
95     for(acount = 0; acount < sid->_nElems; acount++){
96         int p = CkArrayID::CkLocalBranch(destArrayID)->
97             lastKnown(sid->_elems[acount]);
98         
99         if(p == -1) CkAbort("Invalid Section\n");        
100         for(count = 0; count < sid->npes; count ++)
101             if(sid->pelist[count] == p)
102                 break;
103         
104         if(count == sid->npes) {
105             sid->pelist[sid->npes ++] = p;
106         }
107     }   
108 }
109
110 void ComlibSectionInfo::localMulticast(envelope *env){
111     ComlibArrayInfo::localMulticast(&localDestIndexVec, env);
112 }
113