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