inefficiency fixed
[charm.git] / src / conv-com / convcomlibmanager.C
1 /* Converse ComlibManager 
2    Enables communication library strategies to be called from converse code.
3    Also called by the Charm Comlibmanager.
4    
5    Stores a strategy table. Strategies can be inserted and accessed
6    from this table.
7
8    Sameer Kumar 28/03/04
9 */
10
11 #include "convcomlibmanager.h"
12 #include "routerstrategy.h"
13
14 int comm_debug;
15
16 CkpvDeclare(ConvComlibManager *, conv_comm_ptr);
17 CkpvDeclare(int, RecvdummyHandle);
18 CkpvExtern(int, RecvmsgHandle);
19 CkpvExtern(int, RecvCombinedShortMsgHdlrIdx);
20
21
22 ConvComlibManager::ConvComlibManager(): strategyTable(10){
23     nstrats = 0;
24 }
25
26 void ConvComlibManager::insertStrategy(Strategy *s) {
27     StrategyTableEntry &st = strategyTable[nstrats];
28     st.strategy = s;
29
30     s->setInstance(nstrats);
31     // if the strategy is pure converse or pure charm the following line is a
32     // duplication, but if a charm strategy embed a converse strategy it is
33     // necessary to set the instanceID in both
34     s->getConverseStrategy()->setInstance(nstrats);
35     nstrats ++;
36 }
37
38
39 void ConvComlibManager::insertStrategy(Strategy *s, int loc) {
40
41     //For now allow insertion of any location    
42     StrategyTableEntry &st = strategyTable[loc];
43
44     st.strategy = s;
45 }
46
47 //handler for dummy messages
48 void recv_dummy(void *msg){
49     ComlibPrintf("Received Dummy %d\n", CkMyPe());    
50     CmiFree(msg);
51 }
52
53
54 //An initialization routine which does prelimnary initialization of the 
55 //Converse commlib manager. Currently also initialized krishnans code
56 void initComlibManager(){ 
57     CkpvInitialize(ConvComlibManager *, conv_comm_ptr);
58
59     if(CkpvAccess(conv_comm_ptr) != 0)
60        return;   
61  
62     ConvComlibManager *conv_com = new ConvComlibManager();
63     
64     CkpvInitialize(ConvComlibManager *, conv_comm_ptr);
65     CkpvAccess(conv_comm_ptr) = conv_com;
66     
67     //comm_debug = 1;
68     ComlibPrintf("Init Call\n");
69     
70     CkpvInitialize(int, RecvmsgHandle);
71     CkpvInitialize(int, RecvCombinedShortMsgHdlrIdx);
72     
73     CkpvInitialize(int, RecvdummyHandle);
74     CkpvAccess(RecvdummyHandle) = CkRegisterHandler((CmiHandler)recv_dummy);
75
76     PUPable_reg(Strategy);
77     PUPable_reg(RouterStrategy);
78     PUPable_reg(MessageHolder);
79 }
80  
81 Strategy *ConvComlibGetStrategy(int loc) {
82     //Calling converse strategy lets Charm++ strategies one strategy
83     //table entry but multiple layers of strategies (Charm on top of Converse).
84     return (CkpvAccess(conv_comm_ptr))->getStrategy(loc)->getConverseStrategy();
85 }
86
87 void ConvComlibRegisterStrategy(Strategy *s) {
88     (CkpvAccess(conv_comm_ptr))->insertStrategy(s);    
89 }
90
91 void ConvComlibScheduleDoneInserting(int loc) {
92     (* (CkpvAccess(conv_comm_ptr))->getStrategyTable())[loc].
93         call_doneInserting++;
94 }