705a829bc5e34afa5ab09b06c976ac180df0f480
[IRC.git] / Robust / src / Analysis / MLP / ParentChildConflictsMap.java
1 package Analysis.MLP;
2
3 import java.util.HashSet;
4 import java.util.Hashtable;
5 import java.util.Iterator;
6 import java.util.Set;
7
8 import Analysis.OwnershipAnalysis.ReachabilitySet;
9 import Analysis.OwnershipAnalysis.TokenTupleSet;
10 import IR.Flat.TempDescriptor;
11
12 public class ParentChildConflictsMap {
13
14         public static final Integer ACCESSIBLE = new Integer(1);
15         public static final Integer INACCESSIBLE = new Integer(2);
16
17         private Hashtable<TempDescriptor, Integer> accessibleMap;
18         private Hashtable<TempDescriptor, StallSite> stallMap;
19
20         public ParentChildConflictsMap() {
21
22                 accessibleMap = new Hashtable<TempDescriptor, Integer>();
23                 stallMap = new Hashtable<TempDescriptor, StallSite>();
24
25         }
26
27         public Hashtable<TempDescriptor, Integer> getAccessibleMap() {
28                 return accessibleMap;
29         }
30
31         public Hashtable<TempDescriptor, StallSite> getStallMap() {
32                 return stallMap;
33         }
34
35         public void addAccessibleVar(TempDescriptor td) {
36                 accessibleMap.put(td, ACCESSIBLE);
37         }
38
39         public void addInaccessibleVar(TempDescriptor td) {
40                 accessibleMap.put(td, INACCESSIBLE);
41         }
42
43         public void addStallSite(TempDescriptor td) {
44                 StallSite stallSite = new StallSite();
45                 stallMap.put(td, stallSite);
46         }
47         
48         public void addStallSite(TempDescriptor td, StallSite stallSite) {
49                 stallMap.put(td, stallSite);
50         }
51
52         public boolean hasStallSite(TempDescriptor td){
53                 return stallMap.containsKey(td);
54         }
55
56         public boolean isAccessible(TempDescriptor td) {
57                 if (accessibleMap.containsKey(td)
58                                 && accessibleMap.get(td).equals(ACCESSIBLE)) {
59                         return true;
60                 }
61                 return false;
62         }
63
64         public void contributeEffect(TempDescriptor td, String type, String field,
65                         int effect) {
66
67                 StallSite stallSite = stallMap.get(td);
68                 if (stallSite != null) {
69                         stallSite.addEffect(type, field, effect);
70                 }
71
72         }
73
74         public void merge(ParentChildConflictsMap newConflictsMap) {
75
76                 Hashtable<TempDescriptor, Integer> newAccessibleMap = newConflictsMap
77                                 .getAccessibleMap();
78                 Hashtable<TempDescriptor, StallSite> newStallMap = newConflictsMap
79                                 .getStallMap();
80
81                 Set<TempDescriptor> keySet = newAccessibleMap.keySet();
82                 for (Iterator<TempDescriptor> iterator = keySet.iterator(); iterator
83                                 .hasNext();) {
84                         TempDescriptor key = iterator.next();
85
86                         Integer newStatus = newAccessibleMap.get(key);
87
88                         // inaccessible is prior to accessible
89                         Integer currentStatus = getAccessibleMap().get(key);
90                         if (currentStatus != null && currentStatus == ACCESSIBLE
91                                         && newStatus == INACCESSIBLE) {
92                                 getAccessibleMap().put(key, INACCESSIBLE);
93                         }
94                 }
95
96                 keySet = newStallMap.keySet();
97                 for (Iterator<TempDescriptor> iterator = keySet.iterator(); iterator
98                                 .hasNext();) {
99                         TempDescriptor key = iterator.next();
100
101                         StallSite newStallSite = newStallMap.get(key);
102                         StallSite currentStallSite = getStallMap().get(key);
103
104                         // handle effects
105                         HashSet<Effect> currentEffectSet = currentStallSite.getEffectSet();
106                         HashSet<Effect> newEffectSet = newStallSite.getEffectSet();
107                         for (Iterator iterator2 = newEffectSet.iterator(); iterator2
108                                         .hasNext();) {
109                                 Effect effect = (Effect) iterator2.next();
110                                 if (!currentEffectSet.contains(effect)) {
111                                         currentEffectSet.add(effect);
112                                 }
113                         }
114
115                         // handle heap region
116                         HashSet<Integer> currentHRNSet = currentStallSite.getHRNIDSet();
117                         HashSet<Integer> newHRNSet = newStallSite.getHRNIDSet();
118                         for (Iterator iterator2 = newHRNSet.iterator(); iterator2.hasNext();) {
119                                 Integer hrnID = (Integer) iterator2.next();
120                                 if (!currentHRNSet.contains(hrnID)) {
121                                         currentHRNSet.add(hrnID);
122                                 }
123                         }
124
125                         // handle reachabilitySet
126                         ReachabilitySet currentRSet = currentStallSite.getReachabilitySet();
127                         ReachabilitySet newRSet = newStallSite.getReachabilitySet();
128                         Iterator<TokenTupleSet> ttsIter = newRSet.iterator();
129                         while (ttsIter.hasNext()) {
130                                 TokenTupleSet tokenTupleSet = (TokenTupleSet) ttsIter.next();
131                                 currentRSet.add(tokenTupleSet);
132                         }
133
134                         getStallMap()
135                                         .put(
136                                                         key,
137                                                         new StallSite(currentEffectSet, currentHRNSet,
138                                                                         currentRSet));
139
140                 }
141
142         }
143
144 }