Added doxygen documentation.
[charm.git] / src / ck-com / DirectMulticastStrategy.h
1 #ifndef DIRECT_MULTICAST_STRATEGY
2 #define DIRECT_MULTICAST_STRATEGY
3
4 #include "ComlibManager.h"
5 #include "ComlibSectionInfo.h"
6
7 void *DMHandler(void *msg);
8 /**
9  * Main class for multicast strategies. It defaults to sending a direct message
10  * to all the processors involved in the multicast.
11
12  * The definition of the section, as well as the location of all the elements in
13  * the processors is determined by the sending processor. The other will obey to
14  * it, even some elements have already migrated elsewhere.
15  */
16 class DirectMulticastStrategy: public CharmStrategy {
17  protected:
18     //   int handlerId;    
19     ComlibSectionInfo sinfo;
20
21     int isPersistent; 
22     
23     ///Array section support.
24     CkHashtableT<ComlibSectionHashKey, ComlibSectionHashObject *> sec_ht; 
25     
26     ///Add this section to the hash table locally.
27     void insertSectionID(CkSectionID *sid);
28
29     ///Called when a new section multicast is called by the user locally.
30     ///The strategy should then create a topology for it and return a hash
31     ///object to store that topology.
32     virtual ComlibSectionHashObject *createObjectOnSrcPe(int nindices, CkArrayIndexMax *idx_list);
33
34     /**   
35      * Similar to createHashObjectOnSrcPe, but that this call is made on the
36      * destination or intermediate processor. I receives all the information in
37      * the parameters, and it does not use ComlibLastKnown, since in some cases
38      * it can be incoherent.
39
40      * @param nindices number of local elements to multicast
41      * @param idxlist list of local elements
42      * @param npes number of processors involved in the multicast
43      * @param counts list of all the processors involved int the multicast
44      * @param srcpe processor which started the multicast
45      * @return a hash object describing the section
46      */
47     virtual ComlibSectionHashObject *createObjectOnIntermediatePe(int nindices, CkArrayIndexMax *idxlist, int npes, ComlibMulticastIndexCount *counts, int srcpe);
48         
49     ///Called to multicast the message to local array elements.
50     void localMulticast(envelope *env, ComlibSectionHashObject *obj);
51     
52     ///Called to send to message out to the remote destinations.
53     ///This method can be overridden to call converse level strategies.
54     virtual void remoteMulticast(envelope *env, ComlibSectionHashObject *obj);
55
56     ///Process a new message by extracting the array elements from it and
57     ///creating a new hash object by calling createObjectOnIntermediatePe().
58     void handleNewMulticastMessage(envelope *env);
59
60  public:
61
62     DirectMulticastStrategy(CkMigrateMessage *m): CharmStrategy(m){}
63                 
64     ///Array constructor
65     DirectMulticastStrategy(CkArrayID aid, int isPersistent = 0);
66         
67     //Destuctor
68     ~DirectMulticastStrategy();
69         
70     virtual void insertMessage(CharmMessageHolder *msg);
71     virtual void doneInserting();
72
73     ///Called by the converse handler function
74     virtual void handleMessage(void *msg);    
75
76     virtual void pup(PUP::er &p);    
77     virtual void beginProcessing(int nelements);
78     
79     PUPable_decl(DirectMulticastStrategy);
80 };
81 #endif
82