use CkRegisterHandler instead of CmiRegisterHandler
[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_com_object);
17 CkpvDeclare(ConvComlibManager *, conv_com_ptr);
18 CkpvDeclare(int, RecvdummyHandle);
19
20
21 ConvComlibManager::ConvComlibManager(): strategyTable(MAX_NUM_STRATS){
22     nstrats = 0;
23     init_flag = CmiFalse;
24 }
25
26 void ConvComlibManager::insertStrategy(Strategy *s) {
27
28     if(nstrats >= MAX_NUM_STRATS)
29         CkAbort("Too Many strategies\n");
30     
31     StrategyTableEntry &st = strategyTable[nstrats];
32     
33     if(st.strategy != NULL)
34         delete st.strategy;
35
36     st.strategy = s;
37
38     s->setInstance(nstrats);
39     
40     // if the strategy is pure converse or pure charm the following line is a
41     // duplication, but if a charm strategy embed a converse strategy it is
42     // necessary to set the instanceID in both
43     s->getConverseStrategy()->setInstance(nstrats);
44     nstrats ++;
45 }
46
47
48 void ConvComlibManager::insertStrategy(Strategy *s, int loc) {
49
50     if(loc >= MAX_NUM_STRATS)
51         CkAbort("Too Many strategies\n");
52
53     //For now allow insertion of any location    
54     StrategyTableEntry &st = strategyTable[loc];
55
56     //Check to check for the case where the old strategy is not re inserted 
57     if(st.strategy != NULL && st.strategy != s)
58         delete st.strategy;
59     
60     st.strategy = s;
61 }
62
63 //handler for dummy messages
64 void recv_dummy(void *msg){
65     ComlibPrintf("Received Dummy %d\n", CkMyPe());    
66     CmiFree(msg);
67 }
68
69 //extern void propagate_handler(void *);
70 extern void propagate_handler_frag(void *);
71
72 //An initialization routine which does prelimnary initialization of the 
73 //Converse commlib manager. 
74 void initComlibManager(){ 
75
76     if(!CkpvInitialized(conv_com_object))
77         CkpvInitialize(ConvComlibManager, conv_com_object);
78     
79     if(!CkpvInitialized(conv_com_ptr))
80         CkpvInitialize(ConvComlibManager *, conv_com_ptr);
81     
82     if(CkpvAccess(conv_com_object).getInitialized()) 
83       return;
84     
85     CkpvAccess(conv_com_ptr) = &(CkpvAccess(conv_com_object));
86     //comm_debug = 1;
87     ComlibPrintf("Init Call\n");
88     
89     CkpvInitialize(int, RecvdummyHandle);
90     CkpvAccess(RecvdummyHandle) = CkRegisterHandler((CmiHandler)recv_dummy);
91
92     // init strategy specific variables
93     CsvInitialize(int, pipeBcastPropagateHandle);
94     CsvInitialize(int, pipeBcastPropagateHandle_frag);
95     //CsvAccess(pipeBcastPropagateHandle) = CmiRegisterHandler((CmiHandler)propagate_handler);
96     CsvAccess(pipeBcastPropagateHandle_frag) = CmiRegisterHandler((CmiHandler)propagate_handler_frag);
97     
98     PUPable_reg(Strategy);
99     PUPable_reg(RouterStrategy);
100     PUPable_reg(MessageHolder);
101     CkpvAccess(conv_com_object).setInitialized();
102 }
103
104 Strategy *ConvComlibGetStrategy(int loc) {
105     //Calling converse strategy lets Charm++ strategies one strategy
106     //table entry but multiple layers of strategies (Charm on top of Converse).
107     return (CkpvAccess(conv_com_ptr))->getStrategy(loc)->getConverseStrategy();
108 }
109
110 void ConvComlibRegisterStrategy(Strategy *s) {
111     (CkpvAccess(conv_com_ptr))->insertStrategy(s);    
112 }
113
114 void ConvComlibScheduleDoneInserting(int loc) {
115     (* (CkpvAccess(conv_com_ptr))->getStrategyTable())[loc].
116         call_doneInserting++;
117 }