ckmulticast: code docs and pretty indent for recvRedMsg()
[charm.git] / src / libs / ck-libs / multicast / ckmulticast.h
1 #ifndef _MULTICAST
2 #define _MULTICAST
3
4 #include "pup.h"
5 class mCastEntry;
6
7 class multicastSetupMsg;
8 class multicastGrpMsg;
9 class cookieMsg;
10 class CkMcastBaseMsg;
11 class reductionInfo;
12
13 typedef mCastEntry * mCastEntryPtr;
14 PUPbytes(mCastEntryPtr)
15
16 #define MAXMCASTCHILDREN 2
17
18 #include "CkMulticast.decl.h"
19
20 #if 0
21 class CkMcastReductionMsg: public CMessage_CkMcastReductionMsg {
22 friend class CkMulticastMgr;
23 public:
24   int dataSize;
25   char *data;
26   CkSectionInfo sid;
27 private:
28   CkReduction::reducerType reducer;
29   char flag;  // 1: come from array elem 2: come from BOC
30   int redNo;
31   int gcounter;
32   int userFlag; // user set for use by client 
33   char rebuilt;
34   CkCallback callback;   /**< user callback */
35 public:
36   static CkMcastReductionMsg* buildNew(int NdataSize,void *srcData,
37                   CkReduction::reducerType reducer=CkReduction::invalid);
38   void setCallback(CkCallback &cb) { callback = cb; }
39   inline int getSize(void) const {return dataSize;}
40   inline void *getData(void) {return data;}
41 };
42 #endif
43
44 typedef void (*redClientFn)(CkSectionInfo sid, void *param,int dataSize,void *data);
45
46
47
48 /**
49  * A multicast manager group that is a CkDelegateMgr. Can manage all sections of different 
50  * chare arrays, so all functions need a CkSectionInfo parameter to tell CkMulticastMgr which 
51  * array section it should work on.
52  */
53 class CkMulticastMgr: public CkDelegateMgr 
54 {
55     private:
56         /// Internal class for the (array index, location) pair.
57         class IndexPos {
58             public:
59                 CkArrayIndexMax idx;
60                 int  pe;
61             public:
62                 IndexPos() {}
63                 IndexPos(int i): idx(i), pe(i) {}
64                 IndexPos(CkArrayIndexMax i, int p): idx(i), pe(p) {};
65                 void pup(PUP::er &p){ p|idx; p|pe; }
66         };
67         typedef CkVec<IndexPos>  arrayIndexPosList;
68         int factor;           // spanning tree factor, can be negative
69         
70     public:
71         // ------------------------- Cons/Des-tructors ------------------------
72         CkMulticastMgr()  { factor = MAXMCASTCHILDREN; }
73         CkMulticastMgr(CkMigrateMessage *m)  {}
74         CkMulticastMgr(int f)  { factor = f; }
75         int useDefCtor(void){ return 1; }
76         void pup(PUP::er &p){ 
77                 CkDelegateMgr::pup(p);
78                 p|factor;
79         }
80
81         // ------------------------- Spanning Tree Setup ------------------------
82         /// Stuff section member info into CkSectionInfo and call initCookie for the tree building
83         void setSection(CkSectionInfo &id, CkArrayID aid, CkArrayIndexMax *, int n);
84         /// Call initCookie to start the tree build
85         void setSection(CkSectionInfo &id);
86         /// @deprecated { Use the other setSection methods }
87         void setSection(CProxySection_ArrayElement &proxy);
88         /// entry Start the build of a (branch of a) spanning tree rooted at you
89         void setup(multicastSetupMsg *);
90         /// entry My direct children in the tree use this to tell me that they are ready
91         void recvCookie(CkSectionInfo sid, CkSectionInfo child);
92         /// Notify my tree parent (if any) that I am are ready
93         void childrenReady(mCastEntry *entry);
94         // ------------------------- Spanning Tree Teardown ------------------------
95         /// entry Marks tree as obsolete, releases buffered msgs and propagates the call to children
96         void teardown(CkSectionInfo s);
97         /// entry Same as teardown, but also resets the root section info
98         void retire(CkSectionInfo s, CkSectionInfo root);
99         /// entry Actually frees the old spanning tree. Propagates the call to children
100         void freeup(CkSectionInfo s);
101         // ------------------------- Section Cookie Management ------------------------
102         /// entry 
103         void retrieveCookie(CkSectionInfo s, CkSectionInfo srcInfo);
104         /// entry 
105         void recvCookieInfo(CkSectionInfo s, int red);
106         // ------------------------- Multicasts ------------------------
107         /// entry
108         void recvMsg(multicastGrpMsg *m);
109         /// entry
110         void recvPacket(CkSectionInfo &_cookie, int n, char *data, int seqno, int count, int totalsize, int fromBuffer);
111         // ------------------------- Reductions ------------------------
112         /// entry Accept a redn msg from a child in the spanning tree
113         void recvRedMsg(CkReductionMsg *msg);
114         /// entry
115         void updateRedNo(mCastEntryPtr, int red);
116         /// Configure a client to accept the reduction result
117         void setReductionClient(CProxySection_ArrayElement &, redClientFn fn,void *param=NULL);
118         /// Configure a client to accept the reduction result
119         void setReductionClient(CProxySection_ArrayElement &, CkCallback *cb);
120         /// reduction trigger
121         void contribute(int dataSize,void *data,CkReduction::reducerType type, CkSectionInfo &sid, int userData=-1, int fragSize=-1);
122         /// reduction trigger with a callback
123         void contribute(int dataSize,void *data,CkReduction::reducerType type, CkSectionInfo &sid, CkCallback &cb, int userData=-1, int fragSize=-1);
124         /// @note: User should be careful while passing non-default value of fragSize. fragSize%sizeof(data_type) should be zero
125
126
127         /// Recreate the section when root migrate
128         void resetSection(CProxySection_ArrayElement &proxy);  // called by root
129         /// Implement the CkDelegateMgr interface to accept the delegation of a section proxy
130         virtual void initDelegateMgr(CProxy *proxy);
131         /// To implement the CkDelegateMgr interface for section mcasts
132         void ArraySectionSend(CkDelegateData *pd,int ep,void *m, int nsid, CkSectionID *s, int opts);
133         /// Send individually to each section member. Used when tree is out-of-date and needs a rebuild
134         void SimpleSend(int ep,void *m, CkArrayID a, CkSectionID &sid, int opts);
135         /// Retire and rebuild the spanning tree when one of the intermediate vertices migrates
136         void rebuild(CkSectionInfo &);
137         // typedef CkMcastReductionMsg *(*reducerFn)(int nMsg,CkMcastReductionMsg **msgs);
138
139     private:
140         /// Fill the SectionInfo cookie in the SectionID obj with relevant info
141         void prepareCookie(mCastEntry *entry, CkSectionID &sid, const CkArrayIndexMax *al, int count, CkArrayID aid);
142         /// Get info from the CkSectionInfo and call setup() to start the spanning tree build
143         void initCookie(CkSectionInfo sid);
144         /// Actually trigger the multicast to a section of a chare array
145         void sendToSection(CkDelegateData *pd,int ep,void *m, CkSectionID *sid, int opts);
146         /// Mark old cookie spanning tree as old and build a new one
147         void resetCookie(CkSectionInfo sid);
148         enum {MAXREDUCERS=256};
149         // static CkReduction::reducerFn reducerTable[MAXREDUCERS];
150         void releaseBufferedReduceMsgs(mCastEntryPtr entry);
151         void releaseFutureReduceMsgs(mCastEntryPtr entry);
152         inline CkReductionMsg *buildContributeMsg(int dataSize,void *data,CkReduction::reducerType type, CkSectionInfo &id, CkCallback &cb, int userFlag=-1);
153         void reduceFragment (int index, CkSectionInfo& id, mCastEntry* entry, reductionInfo& redInfo,
154                          int& updateReduceNo, int currentTreeUp);
155         CkReductionMsg* combineFrags (CkSectionInfo& id, mCastEntry* entry, reductionInfo& redInfo);
156 };
157
158
159
160
161 extern void CkGetSectionInfo(CkSectionInfo &id, void *msg);
162
163 #endif