The new version of comlib! This version passed "make test" in charm/tests on order...
[charm.git] / src / conv-com / prefixrouter.C
1 /**
2    @addtogroup ConvComlibRouter
3    @{
4    @file 
5 */
6
7
8
9 #include "prefixrouter.h"
10
11 #if 0
12 #define PREFIXDEB printf
13 #else
14 #define PREFIXDEB /* printf */
15 #endif
16
17 void PrefixRouter::EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq) {
18   PREFIXDEB("[%d]Sending through prefix router: ",CmiMyPe());
19   if(!msgq.isEmpty()){
20     MessageHolder *mhdl = msgq[0];
21     if(mhdl->dest_proc<0)  // broadcast or multicast
22         sendMulticast(msgq);
23     else
24         sendPointToPoint(msgq);
25   }
26   Done(id);
27 }
28
29 void PrefixRouter::sendMulticast(CkQ<MessageHolder *> &msgq) {
30     int count;
31     PREFIXDEB("with a multicast\n");
32     while(!msgq.isEmpty()){
33         MessageHolder *mhdl = msgq.deq();
34         
35         if(mhdl->dest_proc == IS_BROADCAST) {
36             for(count = 0; count < npes; count ++) {
37                 int curDest = gpes[MyPe ^ count];
38                 char *msg = mhdl->getMessage();
39                 CmiSyncSend(curDest, mhdl->size, msg);
40             }
41         }
42         else {
43             CmiAbort("Implement later");
44         }
45     }
46 }
47
48 void PrefixRouter::sendPointToPoint(CkQ<MessageHolder *> &msgq) {
49     int count, i;
50     PREFIXDEB("with a point-to-point\n");
51     int len = msgq.length();
52     for(count = 0; count < npes; count ++) {
53         int curDest = gpes[MyPe ^ count];
54         
55         for(i = 0; i < len; i++) {
56             MessageHolder *mhdl = msgq[i];
57             
58             CmiAssert(mhdl->dest_proc >= 0);
59             if(mhdl->dest_proc == curDest) {
60                 char *msg = mhdl->getMessage();
61                 CmiSyncSendAndFree(curDest, mhdl->size, msg);
62             }
63         }
64     }
65     
66     for(i = 0; i < len; i++) {
67         MessageHolder *mhdl = msgq.deq();
68         delete mhdl;
69     }
70 }
71 /*@}*/