Preparing to support bigemulator CCS:
[charm.git] / src / conv-ccs / middle-ccs.C
1 #include "converse.h"
2
3 #if CMK_BLUEGENE_CHARM
4 #include "bgconverse.h"
5 #endif
6 #include "ccs-server.h"
7
8 extern "C" void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData);
9
10 extern "C" void req_fw_handler(char *msg)
11 {
12   int offset = CmiReservedHeaderSize + sizeof(CcsImplHeader);
13   CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiReservedHeaderSize);
14   int destPE = (int)ChMessageInt(hdr->pe);
15   if (CmiMyPe() == 0 && destPE == -1) {
16     /* Broadcast message to all other processors */
17     int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len);
18     CmiSyncBroadcast(len, msg);
19   }
20   else if (destPE < -1) {
21     /* Multicast the message to your children */
22     int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len)-destPE*sizeof(ChMessageInt_t);
23     int index, child, i;
24     int *pes = (int*)(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader));
25     ChMessageInt_t *pes_nbo = (ChMessageInt_t *)pes;
26     offset -= destPE * sizeof(ChMessageInt_t);
27     if (ChMessageInt(pes_nbo[0]) == CmiMyPe()) {
28       for (index=0; index<-destPE; ++index) pes[index] = ChMessageInt(pes_nbo[index]);
29     }
30     for (index=0; index<-destPE; ++index) {
31       if (pes[index] == CmiMyPe()) break;
32     }
33     child = (index << 2) + 1;
34     for (i=0; i<4; ++i) {
35       if (child+i < -destPE) {
36         CmiSyncSend(pes[child+i], len, msg);
37       }
38     }
39   }
40   CcsHandleRequest(hdr, msg+offset);
41   CmiFree(msg);
42 }