modified the registration of the converse handlers for propagate and propagate_frag.
[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
19
20 ConvComlibManager::ConvComlibManager(): strategyTable(10){
21     nstrats = 0;
22 }
23
24 void ConvComlibManager::insertStrategy(Strategy *s) {
25     StrategyTableEntry &st = strategyTable[nstrats];
26     st.strategy = s;
27
28     s->setInstance(nstrats);
29     // if the strategy is pure converse or pure charm the following line is a
30     // duplication, but if a charm strategy embed a converse strategy it is
31     // necessary to set the instanceID in both
32     s->getConverseStrategy()->setInstance(nstrats);
33     nstrats ++;
34 }
35
36
37 void ConvComlibManager::insertStrategy(Strategy *s, int loc) {
38
39     //For now allow insertion of any location    
40     StrategyTableEntry &st = strategyTable[loc];
41
42     st.strategy = s;
43 }
44
45 //handler for dummy messages
46 void recv_dummy(void *msg){
47     ComlibPrintf("Received Dummy %d\n", CkMyPe());    
48     CmiFree(msg);
49 }
50
51 extern void propagate_handler(void *);
52 extern void propagate_handler_frag(void *);
53
54 //An initialization routine which does preliminary initialization of the 
55 //Converse commlib manager. Currently also initialized krishnans code
56 void initComlibManager(){ 
57     CkpvInitialize(ConvComlibManager *, conv_comm_ptr);
58     ConvComlibManager *conv_com = new ConvComlibManager();
59     CkpvAccess(conv_comm_ptr) = conv_com;
60     
61     //comm_debug = 1;
62     ComlibPrintf("Init Call\n");
63     
64     CkpvInitialize(int, RecvdummyHandle);
65     CkpvAccess(RecvdummyHandle) = CkRegisterHandler((CmiHandler)recv_dummy);
66
67     // init strategy specific variables
68     CsvInitialize(int, pipeBcastPropagateHandle);
69     CsvInitialize(int, pipeBcastPropagateHandle_frag);
70     CsvAccess(pipeBcastPropagateHandle) = CmiRegisterHandler((CmiHandler)propagate_handler);
71     CsvAccess(pipeBcastPropagateHandle_frag) = CmiRegisterHandler((CmiHandler)propagate_handler_frag);
72
73     PUPable_reg(Strategy);
74     PUPable_reg(RouterStrategy);
75     PUPable_reg(MessageHolder);
76 }
77  
78 Strategy *ConvComlibGetStrategy(int loc) {
79     //Calling converse strategy lets Charm++ strategies one strategy
80     //table entry but multiple layers of strategies (Charm on top of Converse).
81     return (CkpvAccess(conv_comm_ptr))->getStrategy(loc)->getConverseStrategy();
82 }
83
84 void ConvComlibRegisterStrategy(Strategy *s) {
85     (CkpvAccess(conv_comm_ptr))->insertStrategy(s);    
86 }
87
88 void ConvComlibScheduleDoneInserting(int loc) {
89     (* (CkpvAccess(conv_comm_ptr))->getStrategyTable())[loc].
90         call_doneInserting++;
91 }