3 import java.util.Enumeration;
4 import java.util.HashSet;
5 import java.util.Hashtable;
6 import java.util.Iterator;
9 import Analysis.OwnershipAnalysis.AllocationSite;
10 import Analysis.OwnershipAnalysis.HeapRegionNode;
11 import Analysis.OwnershipAnalysis.ReferenceEdge;
12 import Analysis.OwnershipAnalysis.TokenTupleSet;
13 import IR.Flat.TempDescriptor;
15 public class ParentChildConflictsMap {
17 public static final Integer ACCESSIBLE = new Integer(1);
18 public static final Integer INACCESSIBLE = new Integer(2);
20 private Hashtable<TempDescriptor, Integer> accessibleMap;
21 private Hashtable<TempDescriptor, StallSite> stallMap;
22 private Hashtable < ReferenceEdge, HashSet<StallTag> > stallEdgeMap;
23 private boolean isAfterSESE;
25 public ParentChildConflictsMap() {
27 accessibleMap = new Hashtable<TempDescriptor, Integer>();
28 stallMap = new Hashtable<TempDescriptor, StallSite>();
29 stallEdgeMap= new Hashtable < ReferenceEdge, HashSet<StallTag> >();
33 public void setIsAfterSESE(boolean after){
34 this.isAfterSESE=after;
37 public boolean isAfterSESE(){
42 accessibleMap.clear();
47 public void clearStallMap(){
51 public void makeAllInaccessible(){
53 Set<TempDescriptor> keySet=accessibleMap.keySet();
54 for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
55 TempDescriptor key = (TempDescriptor) iterator.next();
56 accessibleMap.put(key, INACCESSIBLE);
61 public Hashtable < ReferenceEdge, HashSet<StallTag> > getStallEdgeMap(){
65 public void addStallEdge(ReferenceEdge edge, StallTag sTag){
67 HashSet<StallTag> tagSet=stallEdgeMap.get(edge);
69 tagSet=new HashSet<StallTag>();
72 stallEdgeMap.put(edge, tagSet);
75 public HashSet<StallTag> getStallTagByEdge(ReferenceEdge edge){
76 return stallEdgeMap.get(edge);
79 public Hashtable<TempDescriptor, Integer> getAccessibleMap() {
83 public Hashtable<TempDescriptor, StallSite> getStallMap() {
87 public void addAccessibleVar(TempDescriptor td) {
88 accessibleMap.put(td, ACCESSIBLE);
91 public void addInaccessibleVar(TempDescriptor td) {
92 accessibleMap.put(td, INACCESSIBLE);
95 public void addStallSite(TempDescriptor td, HashSet<HeapRegionNode> heapSet, StallTag sTag, TempDescriptor tdA) {
96 StallSite stallSite=new StallSite(heapSet,sTag);
98 stallSite.setTdA(tdA);
100 stallMap.put(td, stallSite);
103 public void addStallSite(TempDescriptor td, StallSite stallSite) {
104 stallMap.put(td, stallSite);
107 public boolean hasStallSite(TempDescriptor td){
108 return stallMap.containsKey(td);
111 public boolean isAccessible(TempDescriptor td) {
112 if (accessibleMap.containsKey(td)
113 && accessibleMap.get(td).equals(ACCESSIBLE)) {
119 public void contributeEffect(TempDescriptor td, String type, String field,
122 StallSite stallSite = stallMap.get(td);
123 if (stallSite != null) {
124 stallSite.addEffect(type, field, effect);
129 public void merge(ParentChildConflictsMap newConflictsMap) {
131 Hashtable<TempDescriptor, Integer> newAccessibleMap = newConflictsMap
133 Hashtable<TempDescriptor, StallSite> newStallMap = newConflictsMap
136 Set<TempDescriptor> keySet = newAccessibleMap.keySet();
137 for (Iterator<TempDescriptor> iterator = keySet.iterator(); iterator
139 TempDescriptor key = iterator.next();
141 Integer newStatus = newAccessibleMap.get(key);
143 // inaccessible is prior to accessible
144 Integer currentStatus = getAccessibleMap().get(key);
145 if (currentStatus != null && currentStatus == ACCESSIBLE
146 && newStatus == INACCESSIBLE) {
147 getAccessibleMap().put(key, INACCESSIBLE);
148 }else if(currentStatus == null && newStatus == ACCESSIBLE){
149 getAccessibleMap().put(key, ACCESSIBLE);
153 keySet = newStallMap.keySet();
154 for (Iterator<TempDescriptor> iterator = keySet.iterator(); iterator
156 TempDescriptor key = iterator.next();
158 StallSite newStallSite = newStallMap.get(key);
159 StallSite currentStallSite = getStallMap().get(key);
161 if(currentStallSite==null){
162 currentStallSite=new StallSite();
166 HashSet<Effect> currentEffectSet = currentStallSite.getEffectSet();
167 HashSet<Effect> newEffectSet = newStallSite.getEffectSet();
168 for (Iterator iterator2 = newEffectSet.iterator(); iterator2
170 Effect effect = (Effect) iterator2.next();
171 if (!currentEffectSet.contains(effect)) {
172 currentEffectSet.add(effect);
176 // handle heap region
177 HashSet<HeapRegionNode> currentHRNSet = currentStallSite.getHRNSet();
178 HashSet<HeapRegionNode> newHRNSet = newStallSite.getHRNSet();
179 for (Iterator iterator2 = newHRNSet.iterator(); iterator2.hasNext();) {
180 HeapRegionNode hrnID = (HeapRegionNode) iterator2.next();
181 if (!currentHRNSet.contains(hrnID)) {
182 currentHRNSet.add(hrnID);
186 // handle reachabilitySet
187 HashSet<TokenTupleSet> currentRSet=currentStallSite.getReachabilitySet();
188 HashSet<TokenTupleSet> newRSet=newStallSite.getReachabilitySet();
189 Iterator<TokenTupleSet> ttsIter=newRSet.iterator();
190 while(ttsIter.hasNext()){
191 TokenTupleSet tokenTupleSet=(TokenTupleSet) ttsIter.next();
192 currentRSet.add(tokenTupleSet);
194 // ReachabilitySet currentRSet = currentStallSite.getReachabilitySet();
195 // ReachabilitySet newRSet = newStallSite.getReachabilitySet();
196 // Iterator<TokenTupleSet> ttsIter = newRSet.iterator();
197 // while (ttsIter.hasNext()) {
198 // TokenTupleSet tokenTupleSet = (TokenTupleSet) ttsIter.next();
199 // currentRSet.add(tokenTupleSet);
202 //handle allocationsite
203 HashSet<AllocationSite> currentAloc=currentStallSite.getAllocationSiteSet();
204 HashSet<AllocationSite> newAloc=newStallSite.getAllocationSiteSet();
205 currentAloc.addAll(newAloc);
207 // handle related stall tags
208 HashSet<StallTag> currentStallTagSet=currentStallSite.getStallTagSet();
209 HashSet<StallTag> newStallTagSet=newStallSite.getStallTagSet();
210 currentStallTagSet.addAll(newStallTagSet);
212 // reaching param idxs
213 HashSet<Integer> currentParamIdx=currentStallSite.getCallerParamIdxSet();
214 HashSet<Integer> newParamIdx=newStallSite.getCallerParamIdxSet();
215 currentParamIdx.addAll(newParamIdx);
217 StallSite merged=new StallSite(currentEffectSet, currentHRNSet,
218 currentRSet, currentAloc, currentStallTagSet,currentParamIdx);
228 // merge edge mapping
230 Hashtable<ReferenceEdge, HashSet<StallTag>> newStallEdgeMapping=newConflictsMap.getStallEdgeMap();
231 Set<ReferenceEdge> edgeSet=newStallEdgeMapping.keySet();
233 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext();) {
234 ReferenceEdge stallEdge = (ReferenceEdge) iterator.next();
235 HashSet<StallTag> newStallTagSet=newStallEdgeMapping.get(stallEdge);
236 HashSet<StallTag>currentStallTagSet=getStallEdgeMap().get(stallEdge);
238 if(currentStallTagSet==null){
239 currentStallTagSet=new HashSet<StallTag>();
241 currentStallTagSet.addAll(newStallTagSet);
242 getStallEdgeMap().put(stallEdge,currentStallTagSet);
247 public Set<Long> getAllocationSiteIDSetofStallSite() {
249 HashSet<Long> returnSet=new HashSet<Long>();
251 Enumeration<StallSite> stallSiteEnum=stallMap.elements();
252 while (stallSiteEnum.hasMoreElements()) {
253 StallSite stallSite = (StallSite) stallSiteEnum.nextElement();
254 HashSet<HeapRegionNode> hrnSet=stallSite.getHRNSet();
255 for (Iterator iterator = hrnSet.iterator(); iterator.hasNext();) {
256 HeapRegionNode hrn = (HeapRegionNode) iterator.next();
257 // allocSiteIDSet.add(hrn.getGloballyUniqueIdentifier());
258 returnSet.add(new Long(hrn
259 .getGloballyUniqueIntegerIdentifier()));
266 public boolean equals(Object o) {
272 if (!(o instanceof ParentChildConflictsMap)) {
276 ParentChildConflictsMap in = (ParentChildConflictsMap) o;
278 if ( accessibleMap.equals(in.getAccessibleMap())
279 && stallMap.equals(in.getStallMap()) && isAfterSESE()==in.isAfterSESE()) {
287 public String toString() {
288 return "ParentChildConflictsMap [accessibleMap=" + accessibleMap