X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FTaskStateAnalysis%2FSafetyAnalysis.java;h=939613773cf40408298017cbfbd77720e28c5812;hb=26239411e098e42b009ced05f6a8c4f6c5bc98bb;hp=241a70e06614ff84167ecd162ee543b3a460dc85;hpb=d88a84263291625e617610429164027b3f12a935;p=IRC.git diff --git a/Robust/src/Analysis/TaskStateAnalysis/SafetyAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/SafetyAnalysis.java index 241a70e0..93961377 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/SafetyAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/SafetyAnalysis.java @@ -118,6 +118,7 @@ public class SafetyAnalysis { public void analyzeFS(FlagState fs, Set egset, Hashtable> fstootd, Hashtable> fsusemap, HashSet tovisit) { Hashtable> timap=new Hashtable>(); + Set tiselfloops=new HashSet(); for(Iterator egit=egset.iterator();egit.hasNext();) { EGTaskNode egnode=egit.next(); @@ -174,8 +175,29 @@ public class SafetyAnalysis { } TaskIndex ti=egnode.isRuntime()?new TaskIndex():new TaskIndex(egnode.getTD(), egnode.getIndex()); if (!ti.runtime) { - //runtime edges don't do anything...don't have to take them, can't predict when we can. - if (timap.containsKey(ti)) { + //runtime edges don't do anything...don't have to take + //them, can't predict when we can. + if (state.selfloops.contains(egnode.getTD().getSymbol())) { + System.out.println("Self loop for: "+egnode.getTD()+" "+egnode.getIndex()); + if (timap.containsKey(ti)) { + if (egnode.getPostFS()!=fs) { + if (tiselfloops.contains(ti)) { + //dump old self loop + timap.put(ti, setotd); + tiselfloops.remove(ti); + } else { + //standard and case + timap.put(ti, createIntersection(timap.get(ti), setotd, fs.getClassDescriptor())); + } + } + } else { + //mark as self loop + timap.put(ti, setotd); + if (egnode.getPostFS()==fs) { + tiselfloops.add(ti); + } + } + } else if (timap.containsKey(ti)) { //AND case timap.put(ti, createIntersection(timap.get(ti), setotd, fs.getClassDescriptor())); } else {