05940b4e2ecb7ef1dde765b2247977232abe5fec
[charm.git] / src / ck-com / ComlibArrayListener.C
1 #include "charm++.h"
2 #include "envelope.h"
3 #include "ckhashtable.h"
4
5 ComlibArrayListener::ComlibArrayListener () 
6     : CkArrayListener(0){ //Carry 1 int for the sid, not used yet
7     nElements = 0;
8     ht = new CkHashtableT<CkArrayIndexMax, CkArrayIndexMax *>;
9     //    CkPrintf("Creating Array Listener\n");
10 }
11
12 ComlibArrayListener::ComlibArrayListener (CkMigrateMessage *m)
13     :CkArrayListener(m) {
14     nElements = 0;
15     ht = new CkHashtableT<CkArrayIndexMax, CkArrayIndexMax *>;
16 }
17
18 void ComlibArrayListener::pup(PUP::er &p) {}
19
20 void ComlibArrayListener::ckElementCreating(ArrayElement *elt){
21     addElement(elt, CmiFalse);
22     //CkPrintf("[%d] Element Created\n", CkMyPe());
23 }
24
25 void ComlibArrayListener::ckElementDied(ArrayElement *elt){
26     deleteElement(elt, CmiFalse);
27 }
28
29 void ComlibArrayListener::ckElementLeaving(ArrayElement *elt){
30     deleteElement(elt, CmiTrue);
31 }
32
33 CmiBool ComlibArrayListener::ckElementArriving(ArrayElement *elt){
34     addElement(elt, CmiTrue);
35     return CmiTrue;
36 }
37
38
39 void ComlibArrayListener::addElement(ArrayElement *elt, 
40                                      CmiBool migration_flag){
41     if(nElements == 0)
42         thisArrayID = elt->ckGetArrayID();
43
44     ht->put(elt->thisIndexMax) = &(elt->thisIndexMax);
45     //elt->thisIndexMax.print();
46     nElements ++;
47
48     if(!migration_flag) {
49         for(int count = 0; count < strategyList.length(); count++){
50             CharmStrategy *strategy = (CharmStrategy *)
51                 strategyList[count]->strategy;
52             if(isRegistered(elt, strategy)) {
53                 strategyList[count]->numElements ++;
54             }
55         }   
56     }
57 }
58
59 void ComlibArrayListener::deleteElement(ArrayElement *elt, 
60                                         CmiBool migration_flag){
61     ht->remove(elt->thisIndexMax);
62     nElements --;
63     
64     if(!migration_flag) {
65         for(int count = 0; count < strategyList.length(); count++){
66             CharmStrategy *strategy = (CharmStrategy *)
67                 strategyList[count]->strategy;
68             if(isRegistered(elt, strategy)) {
69                 strategyList[count]->numElements --;
70             }
71         }   
72     }
73 }
74
75 int ComlibArrayListener::isRegistered(ArrayElement *elt, 
76                                       CharmStrategy *strat){
77     CkArrayIndexMax idx = elt->thisIndexMax;
78
79     CkArrayID st_aid;
80     int st_nelements;
81     CkArrayIndexMax *st_elem;
82     strat->ainfo.getSourceArray(st_aid, st_elem, st_nelements);
83
84     if(st_nelements < 0)
85         CkAbort("Not an Array Strategy\n");
86     
87     if(st_nelements == 0)
88         return 1;   
89
90     for(int count = 0; count < st_nelements; count ++)
91         if(st_elem[count].compare(idx))
92             return 1;
93
94     return 0;
95 }
96  
97 //Assumes strategy is already present in the strategy table   
98 void ComlibArrayListener::registerStrategy(StrategyTableEntry *stable_entry) {
99     strategyList.insertAtEnd(stable_entry);
100
101     CharmStrategy *strat = (CharmStrategy *) stable_entry->strategy;
102
103     CkArrayID st_aid;
104     int st_nelements;
105     CkArrayIndexMax *st_elem;
106     strat->ainfo.getSourceArray(st_aid, st_elem, st_nelements);
107
108     if(st_nelements == 0) {//All elements of array in strategy
109         stable_entry->numElements += nElements;
110         /*
111         CkHashtableIterator *ht_iterator = ht->iterator();
112         ht_iterator->seekStart();
113         while(ht_iterator->hasNext()){
114             CkArrayIndexMax *idx;
115             ht_iterator->next((void **)&idx);
116             stable_entry->strategy->insertLocalIndex(*idx);       
117         }
118         */
119     }
120     else if (st_nelements > 0){ //Only some elements belong to strategy
121         for(int count = 0; count < st_nelements; count ++)
122             if(ht->get(st_elem[count]) != NULL) {
123                 stable_entry->numElements ++;
124             }
125     }
126     else 
127         CkAbort("NOT an Array Strategy\n");
128
129 }
130
131 void ComlibArrayListener::getLocalIndices(CkVec<CkArrayIndexMax> &vec){
132     
133     CkHashtableIterator *ht_iterator = ht->iterator();
134     ht_iterator->seekStart();
135     while(ht_iterator->hasNext()){
136         CkArrayIndexMax *idx;
137         ht_iterator->next((void **)&idx);
138         vec.insertAtEnd(*idx);       
139     }
140 }
141
142