fixed a bug in MultiRing where the sorting of the data was causing problems.
[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     ///Needed for getNewMulticastMessage, to specify if the list of processors need to be ordered
50     virtual int needSorting() { return 0; }
51
52     ///Called to multicast the message to local array elements.
53     void localMulticast(envelope *env, ComlibSectionHashObject *obj);
54     
55     ///Called to send to message out to the remote destinations.
56     ///This method can be overridden to call converse level strategies.
57     virtual void remoteMulticast(envelope *env, ComlibSectionHashObject *obj);
58
59     ///Process a new message by extracting the array elements from it and
60     ///creating a new hash object by calling createObjectOnIntermediatePe().
61     void handleNewMulticastMessage(envelope *env);
62
63  public:
64
65     DirectMulticastStrategy(CkMigrateMessage *m): CharmStrategy(m){}
66                 
67     ///Array constructor
68     DirectMulticastStrategy(CkArrayID aid, int isPersistent = 0);
69         
70     //Destuctor
71     ~DirectMulticastStrategy();
72         
73     virtual void insertMessage(CharmMessageHolder *msg);
74     virtual void doneInserting();
75
76     ///Called by the converse handler function
77     virtual void handleMessage(void *msg);    
78
79     virtual void pup(PUP::er &p);    
80     virtual void beginProcessing(int nelements);
81     
82     PUPable_decl(DirectMulticastStrategy);
83 };
84 #endif
85