9b4f94a3fb668f34d745f0036c0c95adc019040a
[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 void ComlibArrayListener::addElement(ArrayElement *elt, 
39                                      CmiBool migration_flag){
40     if(nElements == 0)
41         thisArrayID = elt->ckGetArrayID();
42
43     ht->put(elt->thisIndexMax) = &(elt->thisIndexMax);
44     //elt->thisIndexMax.print();
45     nElements ++;
46
47     if(!migration_flag) {
48         for(int count = 0; count < strategyList.length(); count++){
49             CharmStrategy *strategy = (CharmStrategy *)
50                 strategyList[count]->strategy;
51             if(isRegistered(elt, strategy)) {
52                 strategyList[count]->numElements ++;
53             }
54         }   
55     }
56 }
57
58 void ComlibArrayListener::deleteElement(ArrayElement *elt, 
59                                         CmiBool migration_flag){
60     ht->remove(elt->thisIndexMax);
61     nElements --;
62     
63     if(!migration_flag) {
64         for(int count = 0; count < strategyList.length(); count++){
65             CharmStrategy *strategy = (CharmStrategy *)
66                 strategyList[count]->strategy;
67             if(isRegistered(elt, strategy)) {
68                 strategyList[count]->numElements --;
69             }
70         }   
71     }
72 }
73
74 int ComlibArrayListener::isRegistered(ArrayElement *elt, 
75                                       CharmStrategy *strat){
76     CkArrayIndexMax idx = elt->thisIndexMax;
77
78     CkArrayID st_aid;
79     int st_nelements;
80     CkArrayIndexMax *st_elem;
81     strat->ainfo.getSourceArray(st_aid, st_elem, st_nelements);
82
83     if(st_nelements < 0)
84         CkAbort("Not an Array Strategy\n");
85     
86     if(st_nelements == 0)
87         return 1;   
88
89     for(int count = 0; count < st_nelements; count ++)
90         if(st_elem[count].compare(idx))
91             return 1;
92
93     return 0;
94 }
95  
96 //Assumes strategy is already present in the strategy table   
97 void ComlibArrayListener::registerStrategy(StrategyTableEntry *stable_entry) {
98     strategyList.insertAtEnd(stable_entry);
99
100     CharmStrategy *strat = (CharmStrategy *) stable_entry->strategy;
101
102     CkArrayID st_aid;
103     int st_nelements;
104     CkArrayIndexMax *st_elem;
105     strat->ainfo.getSourceArray(st_aid, st_elem, st_nelements);
106
107     if(st_nelements == 0) {//All elements of array in strategy
108         stable_entry->numElements += nElements;
109         /*
110         CkHashtableIterator *ht_iterator = ht->iterator();
111         ht_iterator->seekStart();
112         while(ht_iterator->hasNext()){
113             CkArrayIndexMax *idx;
114             ht_iterator->next((void **)&idx);
115             stable_entry->strategy->insertLocalIndex(*idx);       
116         }
117         */
118     }
119     else if (st_nelements > 0){ //Only some elements belong to strategy
120         for(int count = 0; count < st_nelements; count ++)
121             if(ht->get(st_elem[count]) != NULL) {
122                 stable_entry->numElements ++;
123             }
124     }
125     else 
126         CkAbort("NOT an Array Strategy\n");
127
128 }
129
130 void ComlibArrayListener::getLocalIndices(CkVec<CkArrayIndexMax> &vec){
131     
132     CkHashtableIterator *ht_iterator = ht->iterator();
133     ht_iterator->seekStart();
134     while(ht_iterator->hasNext()){
135         CkArrayIndexMax *idx;
136         ht_iterator->next((void **)&idx);
137         vec.insertAtEnd(*idx);       
138     }
139 }
140
141