merging with main branch
[charm.git] / src / ck-com / DirectMulticastStrategy.h
1 /**
2    @addtogroup ComlibCharmStrategy
3    @{
4    @file 
5    @brief Send a multicast by sending once directly to each processor owning destination elements.
6
7 */
8
9 #ifndef DIRECT_MULTICAST_STRATEGY
10 #define DIRECT_MULTICAST_STRATEGY
11
12 #include "MulticastStrategy.h"
13
14
15 /** 
16   Send the multicast by sending once directly to each processor owning destination elements.
17
18   The definition of the section, as well as the location of all the elements in
19   the processors is determined by the sending processor. The other will obey to
20   it, even some elements have already migrated elsewhere.
21
22 */
23 class DirectMulticastStrategy: public MulticastStrategy {
24  protected:
25  
26     ///Called when a new section multicast is called by the user locally.
27     ///The strategy should then create a topology for it and return a hash
28     ///object to store that topology.
29   virtual void createObjectOnSrcPe(ComlibSectionHashObject *obj, int npes, ComlibMulticastIndexCount *pelist);
30
31     /**   
32      * Similar to createHashObjectOnSrcPe, but that this call is made on the
33      * destination or intermediate processor. I receives all the information in
34      * the parameters, and it does not use ComlibLastKnown, since in some cases
35      * it can be incoherent.
36
37      * @param nindices number of local elements to multicast
38      * @param idxlist list of local elements
39      * @param npes number of processors involved in the multicast
40      * @param counts list of all the processors involved int the multicast
41      * @param srcpe processor which started the multicast
42      * @return a hash object describing the section
43      */
44     virtual void createObjectOnIntermediatePe(ComlibSectionHashObject *obj, int npes, ComlibMulticastIndexCount *counts, int srcpe);
45    
46  public:
47     DirectMulticastStrategy(CkMigrateMessage *m): MulticastStrategy(m){}
48                 
49     ///Array constructor
50     DirectMulticastStrategy(): MulticastStrategy() {}
51
52     PUPable_decl(DirectMulticastStrategy);
53
54     virtual void pup(PUP::er &p){ MulticastStrategy::pup(p);}   
55     
56 };
57 #endif
58
59 /*@}*/