Array section helper classes
[charm.git] / src / ck-com / ComlibSectionInfo.h
1 #ifndef COMLIB_SECTION_INFO
2 #define COMLIB_SECTION_INFO
3
4 /***********
5   Helper classes that help strategies manage array sections 
6 ***********/
7
8 /* Hash key that lets a strategy access a section id data structure
9    given the source processor and the MaxSectionId on that processor
10 */
11 class ComlibSectionHashKey{
12  public:
13     int srcPe;
14     int id;
15     ComlibSectionHashKey(int _pe, int _id):srcPe(_pe), id(_id){};
16
17     //These routines allow ComlibSectionHashKey to be used in
18     //  a CkHashtableT
19     CkHashCode hash(void) const;
20     static CkHashCode staticHash(const void *a,size_t);
21     int compare(const ComlibSectionHashKey &ind) const;
22     static int staticCompare(const void *a,const void *b,size_t);
23 };
24
25 /*********** CkHashTable functions ******************/
26 inline CkHashCode ComlibSectionHashKey::hash(void) const
27 {
28     register int _id = id;
29     register int _pe = srcPe;
30     
31     register CkHashCode ret = (_id << 16) + _pe;
32     return ret;
33 }
34
35 inline int ComlibSectionHashKey::compare(const ComlibSectionHashKey &k2) const
36 {
37     if(id == k2.id && srcPe == k2.srcPe)
38         return 1;
39     
40     return 0;
41 }
42
43 /*For calls to qsort*/
44 inline int intCompare(void *a, void *b){
45     int a1 = *(int *) a;
46     int b1 = *(int *) b;
47
48     if(a1 < b1)
49         return -1;
50     
51     if(a1 == b1)
52         return 0;
53
54     if(a1 > b1)
55         return 1;
56
57     return 0;
58 }    
59
60 //ComlibSectionHashKey CODE
61 inline int ComlibSectionHashKey::staticCompare(const void *k1, const void *k2, 
62                                                 size_t ){
63     return ((const ComlibSectionHashKey *)k1)->
64                 compare(*(const ComlibSectionHashKey *)k2);
65 }
66
67 inline CkHashCode ComlibSectionHashKey::staticHash(const void *v,size_t){
68     return ((const ComlibSectionHashKey *)v)->hash();
69 }
70
71 /*************** End CkHashtable Functions *****************/
72
73
74 /*** Class that helps a communication library strategy manage array
75      sections
76 ***************/
77
78 class ComlibSectionInfo {
79     /* Array ID of the array section */
80     CkArrayID destArrayID;
81     
82     //Unique section id for this section
83     //Will be used to access a hashtable on remote processors
84     int MaxSectionID;
85
86     //Instance ID of the strategy
87     int instanceID;
88
89     CkVec<CkArrayIndexMax> localDestIndexVec;
90
91  public:
92
93     ComlibSectionInfo() { 
94         destArrayID.setZero(); MaxSectionID = 1; instanceID = 0;    
95     }
96
97     ComlibSectionInfo(CkArrayID dest, int instance){
98         destArrayID = dest;
99         instanceID = instance;
100
101         MaxSectionID = 1;
102     }
103     
104     void initSectionID(CkSectionID *sid);
105     
106     void processOldSectionMessage(CharmMessageHolder *cmsg);
107
108     ComlibMulticastMsg *getNewMulticastMessage(CharmMessageHolder *cmsg);
109
110     void unpack(envelope *cb_env, CkVec<CkArrayIndexMax> *&destIndices, 
111                 envelope *&env);
112
113     void localMulticast(envelope *env);
114
115     static inline int getSectionID(CkSectionID id) {
116         return id._cookie.sInfo.cInfo.id;
117     }
118     
119 };
120
121 PUPbytes(ComlibSectionInfo);
122
123 #endif