removing one level of virtual functions. May make code run faster
[charm.git] / src / conv-com / router.h
1 #ifndef ROUTER_H
2 #define ROUTER_H
3
4 #include "cklists.h"
5 #include "convcomlibstrategy.h"
6
7 //Base class for routers
8 //Imported from Krishnan's Each To Many Communication Framework
9 //Modified to suit the new communication library
10 //Sameer Kumar 05/14/04
11
12 class Router 
13 {
14     int doneHandle;
15     
16  public:
17     Router() {};
18     virtual ~Router() {};
19     
20     //Insert messages for the all to all operation
21     //All processors will be multicast the same message here
22     virtual void EachToAllMulticast(comID id, int size, void *msg, 
23                                     int more) 
24         {CmiPrintf("Not impl\n");}
25     
26     //Insert messages for the all to all operation. The destination
27     //processors to which a message is multicast to be can be
28     //specified
29     //id = communication operation identifier
30     //size = size of the message
31     //msg = message to be sent
32     //numPes = number of processors the message has to be sent to
33     //pelist = list of relative proc ids the message has to be multicast to
34     //more = do I get more messages ?
35     virtual void EachToManyMulticast(comID id, int size, void *msg, 
36                                      int numPes, int *pelist, 
37                                      int more) 
38         {CmiPrintf("Not impl\n");}
39     
40     virtual void EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq){
41         MessageHolder *mhdl;
42         int len = msgq.length();
43         for(int count = 0; count < len - 1; count++) {
44             mhdl = msgq.deq();
45             EachToManyMulticast(id, mhdl->size, mhdl->getMessage(), 
46                                 mhdl->npes, mhdl->pelist, 1);
47             delete mhdl;
48         }
49         mhdl = msgq.deq();
50         EachToManyMulticast(id, mhdl->size, mhdl->getMessage(), 
51                             mhdl->npes, mhdl->pelist, 0);
52         delete mhdl;
53     }
54
55     //The first iteration of message combining should call this
56     //entry function
57     virtual void RecvManyMsg(comID, char *) {CmiPrintf("Not Impl\n");}
58     
59     //The send and the rest of the iterations should call this
60     //entry function
61     virtual void ProcManyMsg(comID, char *) {CmiPrintf("Not Impl\n");}
62     
63     //Received a dummy
64     virtual void DummyEP(comID, int )   {CmiPrintf("Base Dummy\n");}
65     
66     //Set the map between processors and virtual processor id's
67     //Useful when only a subset of processors are involved in the
68     //communication operation
69     virtual void SetMap(int *) {;}
70
71     //Utility function
72     void SendDummyMsg(comID id, int pe, int magic) {
73         
74         ComlibPrintf("[%d] Send Dummy to %d\n", CkMyPe(), pe);
75
76         DummyMsg *m=(DummyMsg *)CmiAlloc(sizeof(DummyMsg));
77         CmiSetHandler(m, CkpvAccess(DummyHandle));
78         m->id=id;
79         m->magic=magic;
80         CmiSyncSendAndFree(pe, sizeof(DummyMsg),(char*) m);
81     }
82
83     void setDoneHandle(int handle) {
84         doneHandle = handle;
85     }
86
87     void Done(comID id) {
88
89         //ComlibPrintf("Router Iteration Finished %d", CkMyPe());
90
91         if(doneHandle == 0)
92             return;
93
94         DummyMsg *m=(DummyMsg *)CmiAlloc(sizeof(DummyMsg));
95         m->id=id;
96         CmiSetHandler(m, doneHandle);
97         CmiSyncSendAndFree(CkMyPe(), sizeof(DummyMsg), (char*)m);
98     }
99 };
100
101 #endif