7754ab99e6bf31ea20e98fe22017c08269681369
[charm.git] / src / ck-com / DirectMulticastStrategy.h
1 #ifndef DIRECT_MULTICAST_STRATEGY
2 #define DIRECT_MULTICAST_STRATEGY
3
4 #include "ComlibManager.h"
5
6 void *DMHandler(void *msg);
7
8 class ComlibSectionHashKey{
9  public:
10
11     int srcPe;
12     int id;
13     ComlibSectionHashKey(int _pe, int _id):srcPe(_pe), id(_id){};
14
15     //These routines allow ComlibSectionHashKey to be used in
16     //  a CkHashtableT
17     CkHashCode hash(void) const;
18     static CkHashCode staticHash(const void *a,size_t);
19     int compare(const ComlibSectionHashKey &ind) const;
20     static int staticCompare(const void *a,const void *b,size_t);
21 };
22
23 inline CkHashCode ComlibSectionHashKey::hash(void) const
24 {
25     register int _id = id;
26     register int _pe = srcPe;
27     
28     register CkHashCode ret = (_id << 16) + _pe;
29     return ret;
30 }
31
32 inline int ComlibSectionHashKey::compare(const ComlibSectionHashKey &k2) const
33 {
34     if(id == k2.id && srcPe == k2.srcPe)
35         return 1;
36     
37     return 0;
38 }
39
40 /*For calls to qsort*/
41 int intCompare(void *a, void *b);
42
43 class DirectMulticastStrategy: public CharmStrategy {
44  protected:
45     CkQ <CharmMessageHolder*> *messageBuf;
46
47     int ndestpes, *destpelist; //Destination processors
48     int handlerId;
49     int MaxSectionID;
50
51     int isDestinationArray, isDestinationGroup;
52
53     //Array support
54     CkArrayID destArrayID;
55     CkVec<CkArrayIndexMax> localDestIndices;
56     //Array section support
57     CkHashtableT<ComlibSectionHashKey, void *> sec_ht; 
58     
59     //Initialize and cache information in a section id which can be
60     //used the next time the section is multicast to.
61     virtual void initSectionID(CkSectionID *sid);
62     
63     //Common Initializer for group and array constructors
64     //Every substrategy should implement its own
65     void commonInit();
66     
67     //Called to multicast an array message locally
68     void localMulticast(CkVec<CkArrayIndexMax> *, envelope *env);
69
70     //Create a new multicast message with the array section in it
71     ComlibMulticastMsg * getNewMulticastMessage(CharmMessageHolder *cmsg);
72
73  public:
74     
75     //Group constructor
76     DirectMulticastStrategy(int ndestpes = 0, int *destpelist = 0);    
77
78     //Array constructor
79     DirectMulticastStrategy(CkArrayID aid);
80
81     DirectMulticastStrategy(CkMigrateMessage *m): CharmStrategy(m){}
82     
83     virtual void insertMessage(CharmMessageHolder *msg);
84     virtual void doneInserting();
85
86     //Called by the converse handler function
87     virtual void handleMulticastMessage(void *msg);
88     
89     virtual void pup(PUP::er &p);    
90     virtual void beginProcessing(int nelements);
91     
92     PUPable_decl(DirectMulticastStrategy);
93
94 };
95 #endif
96