import IR.State;
import IR.SymbolTable;
import IR.ClassDescriptor;
+import IR.TaskDescriptor;
import java.io.File;
import java.io.FileWriter;
import java.io.FileOutputStream;
State state;
Hashtable cdtonodes;
Hashtable nodes;
+ Hashtable<TaskNode,TaskNode> alltasknodes;
+
+ //Colors
+ String colors[]={"red","blue","green","brown","orange","pink","black","brown","grey","olivedrab"};
public TaskGraph(State state, TaskAnalysis taskanalysis) {
this.state=state;
this.taskanalysis=taskanalysis;
this.cdtonodes=new Hashtable();
+ this.alltasknodes=new Hashtable<TaskNode,TaskNode>();
for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
ClassDescriptor cd=(ClassDescriptor) classit.next();
if (cd.hasFlags())
produceTaskNodes(cd);
}
+ produceAllTaskNodes();
}
if (fs.isSourceNode()) {
sn=new TaskNode("Start Node");
if(fs.edges().hasNext()){
- addEdges(fs,sn);
+ addEdges(fs,sn,tasknodes);
}
}
FEdge inedge=(FEdge)it_inedges.next();
tn=new TaskNode(inedge.getLabel());
if(fs.edges().hasNext()){
- addEdges(fs,tn);
+ addEdges(fs,tn,tasknodes);
}
}
}
}
+ private void produceAllTaskNodes(){
+ alltasknodes=new Hashtable<TaskNode,TaskNode>();
+
+ for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();){
+ TaskDescriptor td=(TaskDescriptor)it_tasks.next();
+ TaskNode tn=new TaskNode(td.getSymbol());
+ alltasknodes.put(tn,tn);
+ }
+ TaskNode tn_runtime=new TaskNode("Runtime");
+ alltasknodes.put(tn_runtime,tn_runtime);
+
+ int ColorID=0;
+ for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext()&&ColorID<10;) {
+ ClassDescriptor cd=(ClassDescriptor) classit.next();
+ Set fsnodes;
+
+ if (cd.hasFlags()&&((fsnodes=taskanalysis.getFlagStates(cd))!=null)){
+ System.out.println(cd.getSymbol());
+ for(Iterator it=fsnodes.iterator();it.hasNext();) {
+ FlagState fs=(FlagState)it.next();
+ Iterator it_inedges=fs.inedges();
+ TaskNode tn,sn;
+
+
+ if (fs.isSourceNode()){
+ if(fs.edges().hasNext()){
+ Vector allocatingtasks=fs.getAllocatingTasks();
+ for(Iterator it_at=allocatingtasks.iterator();it_at.hasNext();){
+ tn=new TaskNode(((TaskDescriptor)it_at.next()).getSymbol());
+ addEdges(fs,tn,alltasknodes,ColorID);
+ }
+ }
+ }
+
+ while(it_inedges.hasNext()){
+ FEdge inedge=(FEdge)it_inedges.next();
+ tn=new TaskNode(inedge.getLabel());
+ if(fs.edges().hasNext()){
+ addEdges(fs,tn,alltasknodes,ColorID);
+ }
+ }
+ }
+ ColorID++;
+ }
+
+ }
+ }
+
+ public Set getAllTaskNodes(){
+ return alltasknodes.keySet();
+ }
+
+
+
+
+
+
+
+
/* private void mergeAllNodes(){
Hashtable alltasks=new Hashtable();
for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
*/
- private void addEdges(FlagState fs, TaskNode tn){
+ private void addEdges(FlagState fs, TaskNode tn,Hashtable<TaskNode,TaskNode> tasknodes){
- Hashtable<TaskNode,TaskNode> tasknodes=(Hashtable<TaskNode,TaskNode>)cdtonodes.get(fs.getClassDescriptor());
+ // Hashtable<TaskNode,TaskNode> tasknodes=(Hashtable<TaskNode,TaskNode>)cdtonodes.get(fs.getClassDescriptor());
tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
for (Iterator it_edges=fs.edges();it_edges.hasNext();){
TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
TEdge newedge=new TEdge(target);
if (! tn.edgeExists(newedge))
- tn.addEdge(new TEdge(target));
+ tn.addEdge(newedge);
}
}
+ private void addEdges(FlagState fs, TaskNode tn,Hashtable<TaskNode,TaskNode> tasknodes,int ColorID){
+
+ tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
+ for (Iterator it_edges=fs.edges();it_edges.hasNext();){
+ TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
+ target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
+
+ TEdge newedge=new TEdge(target);
+ newedge.setDotNodeParameters("style=bold, color = "+colors[ColorID]);
+ if (! tn.edgeExists(newedge))
+ tn.addEdge(newedge);
+ }
+
+ }
}
taskgraphmap=new Hashtable();
taskmap = new Hashtable();
sourcenodemap=new Hashtable();
+
for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();){
TaskDescriptor td=(TaskDescriptor)it_tasks.next();
taskmap.put("/"+td.getSymbol()+".html",td);
}
+
for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
ClassDescriptor cd=(ClassDescriptor) it_classes.next();
- Vector rootnodes=taskanalysis.getRootNodes(cd);
- if(rootnodes!=null)
- for(Iterator it_rootnodes=rootnodes.iterator();it_rootnodes.hasNext();){
- FlagState root=(FlagState)it_rootnodes.next();
- Vector cd_nodeid=new Vector(); //Vector is designed to contain only 2 elements: ClassDescriptor,Node label
+ if(cd.hasFlags()){
+ Vector rootnodes=taskanalysis.getRootNodes(cd);
+
+ if(rootnodes!=null)
+ for(Iterator it_rootnodes=rootnodes.iterator();it_rootnodes.hasNext();){
+ FlagState root=(FlagState)it_rootnodes.next();
+ Vector cd_nodeid=new Vector(); //Vector is designed to contain only 2 elements: ClassDescriptor,Node label
// Both the values are required to correctly resolve the rootnode.
// Should think of a better way to do this, instead of using a vector(maybe a class)
- cd_nodeid.addElement(cd); //adding the ClassDescriptor
- cd_nodeid.addElement(root.getLabel()); //adding the Node label
- sourcenodemap.put("/"+cd.getSymbol()+"_"+root.getLabel()+".html",cd_nodeid);
- }
- }
+ cd_nodeid.addElement(cd); //adding the ClassDescriptor
+ cd_nodeid.addElement(root.getLabel()); //adding the Node label
+ sourcenodemap.put("/"+cd.getSymbol()+"_"+root.getLabel()+".html",cd_nodeid);
+ }
+ }
}
+ }
public boolean specialRequest(String filename) {
System.out.println(filename);
if (filename.equals("/index.html"))
return true;
+ if (filename.equals("/UnifiedTaskGraph.html"))
+ return true;
if (flagstatemap.containsKey(filename))
return true;
if (taskgraphmap.containsKey(filename))
public String handleresponse(String filename, OutputStream out, HTTPResponse resp) {
if (filename.equals("/index.html"))
return indexpage(out, resp);
+ if (filename.equals("/UnifiedTaskGraph.html"))
+ return unifiedTaskGraph(out,resp);
if (flagstatemap.containsKey(filename))
return flagstate((ClassDescriptor) flagstatemap.get(filename), out, resp);
if (taskgraphmap.containsKey(filename))
taskgraphmap.put("/"+cd.getSymbol()+"-t.html", cd);
}
}
+ pw.println("<br><br><a href=\"/UnifiedTaskGraph.html\">Program flow</a>");
pw.flush();
return null;
}
+
+ private String unifiedTaskGraph(OutputStream out, HTTPResponse resp){
+ Set objects=taskgraph.getAllTaskNodes();
+ File file=new File("UnifiedTaskGraph.dot");
+ /*File mapfile;
+ String str;
+ Vector namers=new Vector();
+ namers.add(new Namer());
+ namers.add(new TaskNodeNamer());
+*/
+ try {
+ //Generate jpg
+ Runtime r=Runtime.getRuntime();
+ FileOutputStream dotstream=new FileOutputStream(file,false);
+ FlagState.DOTVisitor.visit(dotstream, objects);
+ dotstream.close();
+ Process p=r.exec("dot -Tjpg -oUnifiedTaskGraph.jpg UnifiedTaskGraph.dot");
+ p.waitFor();
+ p=r.exec("dot -Tps UnifiedTaskGraph.dot -oUnifiedTaskGraph.ps");
+
+ p.waitFor();
+
+ PrintWriter pw=new PrintWriter(out);
+ pw.println("<a href=\"/UnifiedTaskGraph.ps\">ps</a><br>");
+ // pw.println("<a href=\"/"+ cd.getSymbol()+"-t.map\"><img src=\"/"+ cd.getSymbol()+"-t.gif\" ismap=\"ismap\"></A>");
+ pw.println("<img src=\"/UnifiedTaskGraph.jpg\" />");
+
+ pw.flush();
+ } catch (Exception e) {e.printStackTrace();System.exit(-1);}
+ return null;
+ }
}