Adding communication library in src/ck-com and src/conv-com
[charm.git] / src / conv-com / convcomlibstrategy.C
1
2 #include <converse.h>
3 #include "convcomlibstrategy.h"
4
5 //Class that defines the entry methods that a strategy must define.
6 //To write a new strategy inherit from this class and define the
7 //virtual methods.  Every strategy can also define its own constructor
8 //and have any number of arguments. Also call the parent class methods
9 //in those methods. The strategies defined here can only be used in
10 //converse. For Charm++ strategies please see ck-core/ComlibStraetgy.h
11
12 Strategy::Strategy() : PUP::able() {
13     myInstanceID = 0;
14     type = CONVERSE_STRATEGY;
15     converseStrategy = this;
16 };
17
18 //Each strategy must define his own Pup interface.
19 void Strategy::pup(PUP::er &p){ 
20
21     PUP::able::pup(p);
22
23     p | isStrategyBracketed;
24     p | type;
25 }
26
27
28 //Message holder functions. Message holder is a wrapper around a
29 //message. Has other useful data like destination processor list for a
30 //multicast etc.
31
32 MessageHolder::MessageHolder(char * msg, int proc, int sz) : PUP::able() {
33     data = msg;
34     dest_proc = proc;
35     size = sz;
36     
37     isDummy = 0;
38
39     npes = 0;
40     pelist = 0;
41 }
42
43 MessageHolder::~MessageHolder() {
44     /*
45       if(pelist != NULL && npes > 0)
46       delete[] pelist;
47     */
48 }
49
50 char * MessageHolder::getMessage(){
51     return data;
52 }
53
54 void MessageHolder::pup(PUP::er &p) {
55     PUP::able::pup(p);
56
57     p | dest_proc;
58     p | isDummy;
59     p | size;
60     p | npes;    
61
62     if(p.isUnpacking()) {
63         data = (char *)CmiAlloc(size);
64         
65         if(npes >0)
66             pelist = new int[npes];
67     }
68
69     p(data, size);
70     if(npes > 0)
71         p(pelist, npes);    
72     else
73         pelist = 0;
74 }
75
76 void StrategyWrapper::pup (PUP::er &p) {
77
78     //CkPrintf("In PUP of StrategyWrapper\n");
79
80     p | nstrats;
81     if(p.isUnpacking())
82         s_table = new Strategy * [nstrats];
83     
84     for(int count = 0; count < nstrats; count ++)
85         p | s_table[count];
86 }
87
88
89 StrategyTableEntry::StrategyTableEntry() {
90     strategy = NULL;
91     
92     numElements = 0;   //used by the array listener, 
93                        //could also be used for other objects
94     elementCount = 0;  //Count of how many elements have deposited
95                        //their data
96     nEndItr = 0;       //#elements that called end iteration
97     call_doneInserting = 0;
98 }
99
100
101 PUPable_def(Strategy);
102 PUPable_def(MessageHolder);