From: sivaji Date: Fri, 18 May 2007 03:56:20 +0000 (+0000) Subject: Updated FlagState and TaskAnalysis with tagsupport. X-Git-Tag: preEdgeChange~586 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=40dc4d0a6df34c20ed18dfef8aa93cc83b184ac6;p=IRC.git Updated FlagState and TaskAnalysis with tagsupport. --- diff --git a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java index 44c82747..bc07cade 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java +++ b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java @@ -32,7 +32,7 @@ public class FlagState { int discoverytime = -1; int finishingtime = -1; /* used for searches */ - //Hashtable tags=new Hashtable(); + //Hashtable tags=new Hashtable(); Vector edges = new Vector(); Vector inedges = new Vector(); NodeStatus status = UNVISITED; @@ -44,7 +44,7 @@ public class FlagState { private final HashSet flagstate; private final ClassDescriptor cd; - private final Hashtable tags; + private final Hashtable tags; public void setOption(String option) { this.nodeoption=","+option; @@ -60,7 +60,7 @@ public class FlagState { public FlagState(ClassDescriptor cd) { this.flagstate=new HashSet(); this.cd=cd; - this.tags=new Hashtable(); + this.tags=new Hashtable(); this.uid=FlagState.nodeid++; } @@ -70,7 +70,7 @@ public class FlagState { * @param cd ClassDescriptor * @param flagstate a HashSet containing FlagDescriptors */ - private FlagState(HashSet flagstate, ClassDescriptor cd,Hashtable tags) { + private FlagState(HashSet flagstate, ClassDescriptor cd,Hashtable tags) { this.flagstate=flagstate; this.cd=cd; this.tags=tags; @@ -100,16 +100,16 @@ public class FlagState { public FlagState setTag(TagDescriptor tag){ - HashSet newset=flagstate.clone(); - Hashtable newtags=tags.clone(); + HashSet newset=(HashSet)flagstate.clone(); + Hashtable newtags=(Hashtable)tags.clone(); if (newtags.containsKey(tag)){ switch (newtags.get(tag).intValue()){ case ONETAG: - newtags.put(tag,new Integer(MULTITAG)); + newtags.put(tag,new Integer(MULTITAGS)); break; - case MULTITAG: - newtags.put(tag,new Integer(MULTITAG)); + case MULTITAGS: + newtags.put(tag,new Integer(MULTITAGS)); break; } } @@ -126,38 +126,42 @@ public class FlagState { if (tagtype.equals(td.getSymbol())) return tags.get(td).intValue(); //returns either ONETAG or MULTITAG } - return NOTAG; + return NOTAGS; } public FlagState[] clearTag(TagDescriptor tag){ + FlagState[] retstates; if (tags.containsKey(tag)){ switch(tags.get(tag).intValue()){ case ONETAG: - HashSet newset=flagstate.clone(); - Hashtable newtags=tags.clone(); + HashSet newset=(HashSet)flagstate.clone(); + Hashtable newtags=(Hashtable)tags.clone(); newtags.remove(tag); - return new FlagState(newset,cd,newtags); - break; - case MULTITAG: - //when tagcount is more than 2, COUNT stays at MULTITAG - FlagState[] retstates=new FlagState[2]; - HashSet newset1=flagstate.clone(); - Hashtable newtags1=tags.clone(); + retstates=new FlagState[]{new FlagState(newset,cd,newtags)}; + return retstates; + + case MULTITAGS: + //when tagcount is more than 2, COUNT stays at MULTITAGS + retstates=new FlagState[2]; + HashSet newset1=(HashSet)flagstate.clone(); + Hashtable newtags1=(Hashtable)tags.clone(); retstates[1]=new FlagState(newset1,cd,newtags1); //when tagcount is 2, COUNT changes to ONETAG - HashSet newset2=flagstate.clone(); - Hashtable newtags2=tags.clone(); + HashSet newset2=(HashSet)flagstate.clone(); + Hashtable newtags2=(Hashtable)tags.clone(); newtags1.put(tag,new Integer(ONETAG)); retstates[1]=new FlagState(newset2,cd,newtags2); return retstates; - break; + default: + return null; } }else{ throw new Error("Invalid Operation: Can not clear a tag that doesn't exist."); + } } @@ -197,12 +201,14 @@ public class FlagState { public FlagState setFlag(FlagDescriptor fd, boolean status) { HashSet newset=(HashSet) flagstate.clone(); + Hashtable newtags=(Hashtable)tags.clone(); if (status) newset.add(fd); else if (newset.contains(fd)){ newset.remove(fd); } - return new FlagState(newset, cd); + + return new FlagState(newset, cd,newtags); } /** Tests for equality of two flagstate objects. @@ -302,7 +308,7 @@ public class FlagState { case ONETAG: label+=", "+td.toString()+"(1)"; break; - case MULTITAG: + case MULTITAGS: label+=", "+td.toString()+"(n)"; break; default: diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java index 441de09e..4e786816 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java @@ -219,14 +219,18 @@ public class TaskAnalysis { toprocess.add(fsnew); } } else if (ffan.getTaskType() == FlatFlagActionNode.TASKEXIT) { - FlagState fs_taskexit=evalTaskExitNode(ffan,cd,fs,temp); - if (!sourcenodes.containsKey(fs_taskexit)) { - toprocess.add(fs_taskexit); - } - //seen this node already - fs_taskexit=canonicalizeFlagState(sourcenodes,fs_taskexit); - Edge newedge=new Edge(fs_taskexit,taskname); - fs.addEdge(newedge); + Vector fsv_taskexit=evalTaskExitNode(ffan,cd,fs,temp); + + for(Enumeration en=fsv_taskexit.elements();en.hasMoreElements();){ + FlagState fs_taskexit=(FlagState)en.nextElement(); + if (!sourcenodes.containsKey(fs_taskexit)) { + toprocess.add(fs_taskexit); + } + //seen this node already + fs_taskexit=canonicalizeFlagState(sourcenodes,fs_taskexit); + Edge newedge=new Edge(fs_taskexit,taskname); + fs.addEdge(newedge); + } } } } @@ -250,11 +254,11 @@ private boolean isTaskTrigger_flag(FlagExpressionNode fen,FlagState fs) { else switch (((FlagOpNode)fen).getOp().getOp()) { case Operation.LOGIC_AND: - return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger(((FlagOpNode)fen).getRight(),fs))); + return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs))); case Operation.LOGIC_OR: - return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger(((FlagOpNode)fen).getRight(),fs))); + return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs))); case Operation.LOGIC_NOT: - return !(isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)); + return !(isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)); default: return false; } @@ -266,15 +270,14 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){ for (int i=0;i evalTaskExitNode(FlatNode nn,ClassDescriptor cd,FlagState fs, TempDescriptor temp){ FlagState fstemp=fs; //FlagState[] fstemparray=new FlagState[3]; - Vector fsv=new Vector(); - - + Vector inprocess=new Vector(); + Vector processed=new Vector(); + for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) { TempFlagPair tfp=(TempFlagPair)it_tfp.next(); if (temp==tfp.getTemp()) fstemp=fstemp.setFlag(tfp.getFlag(),((FlatFlagActionNode)nn).getFlagChange(tfp)); } + inprocess.add(fstemp); + processed.add(fstemp); + for(Iterator it_ttp=((FlatFlagActionNode)nn).getTempTagPairs();it_ttp.hasNext();) { TempTagPair ttp=(TempTagPair)it_ttp.next(); - if (temp==ttp.getTemp()){ - if (((FlatFlagActionNode)nn).getTagChange(ttp)){ - fstemp=fstemp.setTag(ttp.getTag()); - fstemp - else - fstemparray + + if (temp==ttp.getTemp()){ + processed=new Vector(); + for (Enumeration en=inprocess.elements();en.hasMoreElements();){ + FlagState fsworking=(FlagState)en.nextElement(); + if (((FlatFlagActionNode)nn).getTagChange(ttp)){ + fsworking=fsworking.setTag(ttp.getTag()); + processed.add(fsworking); + } + else + { + processed.addAll(Arrays.asList(fsworking.clearTag(ttp.getTag()))); + } + } + inprocess=processed; } - - return fstemp; - } + } + return processed; + +} private FlagState canonicalizeFlagState(Hashtable sourcenodes, FlagState fs){ @@ -408,5 +426,6 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){ fstemp=canonicalizeFlagState(sourcenodes,fstemp); fs.addEdge(new Edge(fstemp,"Runtime")); } + } } -} +