1 package Analysis.Scheduling;
3 import Analysis.TaskStateAnalysis.*;
9 /** This class holds flag transition diagram(s) can be put on one core.
11 public class ScheduleNode extends GraphNode implements Cloneable{
14 private static int nodeID=0;
18 private Hashtable<ClassDescriptor, Vector<ScheduleNode>> targetSNodes;
19 private boolean sorted = false;
21 private boolean clone = false;
23 private Vector<ClassNode> classNodes;
24 Vector<ScheduleEdge> scheduleEdges;
27 * @param cd ClassDescriptor
30 public ScheduleNode() {
31 this.uid=ScheduleNode.nodeID++;
35 public ScheduleNode(ClassNode cn) {
36 this.uid=ScheduleNode.nodeID++;
38 this.classNodes = new Vector<ClassNode>();
39 this.scheduleEdges = new Vector<ScheduleEdge>();
40 this.classNodes.add(cn);
41 this.addEdge(cn.getEdgeVector());
48 public int getCoreNum() {
52 public void setCoreNum(int coreNum) {
53 this.coreNum = coreNum;
56 public void addTargetSNode(ClassDescriptor cd, ScheduleNode sn) {
57 if(this.targetSNodes == null) {
58 this.targetSNodes = new Hashtable<ClassDescriptor, Vector<ScheduleNode>>();
61 if(!this.targetSNodes.containsKey(cd)) {
62 this.targetSNodes.put(cd, new Vector<ScheduleNode>());
64 this.targetSNodes.get(cd).add(sn);
67 public void listTasks() {
68 if(this.tasks == null) {
69 this.tasks = new Vector();
73 for(i = 0; i < classNodes.size(); i++) {
74 Iterator it_flags = classNodes.elementAt(i).getFlags();
75 while(it_flags.hasNext()) {
76 FlagState fs = (FlagState)it_flags.next();
77 Iterator it_edges = fs.edges();
78 while(it_edges.hasNext()) {
79 TaskDescriptor td = ((FEdge)it_edges.next()).getTask();
80 if(!this.tasks.contains(td)) {
88 public void addTask(TaskDescriptor task){
92 public Vector getTasks(){
96 public boolean isSorted() {
100 public void setSorted(boolean sorted) {
101 this.sorted = sorted;
104 public boolean isclone() {
108 public String toString() {
109 String temp = new String("");
110 for(int i = 0; i < classNodes.size(); i++) {
111 temp += classNodes.elementAt(i).getClassDescriptor().toString() + ", ";
113 temp += getTextLabel();
117 public Vector getClassNodes() {
118 if(classNodes == null) {
119 classNodes = new Vector<ClassNode>();
124 public Iterator getClassNodesIterator() {
125 return classNodes.iterator();
128 public void resetClassNodes() {
132 public Vector getScheduleEdges() {
133 if(scheduleEdges == null) {
134 scheduleEdges = new Vector<ScheduleEdge>();
136 return scheduleEdges;
139 public Iterator getScheduleEdgesIterator() {
140 return scheduleEdges.iterator();
143 public void resetScheduleEdges() {
144 scheduleEdges = null;
147 /** Tests for equality of two flagstate objects.
150 public boolean equals(Object o) {
151 if (o instanceof ScheduleNode) {
152 ScheduleNode fs=(ScheduleNode)o;
153 if ((fs.getCoreNum() != this.coreNum) ||
154 (fs.sorted != this.sorted) ||
155 (fs.clone != this.clone)){
158 if(fs.tasks != null) {
159 if(!fs.tasks.equals(this.tasks)) {
162 } else if (tasks != null) {
165 if (fs.targetSNodes != null) {
166 if(!fs.targetSNodes.equals(this.targetSNodes)) {
169 } else if(this.targetSNodes != null) {
172 if(fs.classNodes != null) {
173 if(!fs.classNodes.equals(classNodes)) {
176 } else if(classNodes != null) {
179 return (fs.scheduleEdges.equals(scheduleEdges));
184 public int hashCode() {
185 return classNodes.hashCode()^scheduleEdges.hashCode();
188 public String getLabel() {
189 return "cluster" + uid;
192 public String getTextLabel() {
194 if(this.coreNum != -1) {
195 label = "Core " + this.coreNum;
203 public Object clone(Hashtable<ClassNode, ClassNode> cn2cn) {
204 ScheduleNode o = null;
206 o = (ScheduleNode)super.clone();
207 } catch(CloneNotSupportedException e){
210 o.uid = ScheduleNode.nodeID++;
211 // Clone all the internal ClassNodes and ScheduleEdges
212 Vector<ClassNode> tcns = new Vector<ClassNode>();
213 Vector<ScheduleEdge> tses = new Vector<ScheduleEdge>();
215 for(i = 0; i < this.classNodes.size(); i++) {
216 ClassNode tcn = this.classNodes.elementAt(i);
217 ClassNode cn = (ClassNode)tcn.clone();
218 cn.setScheduleNode(o);
222 for(i = 0; i < this.scheduleEdges.size(); i++) {
223 ScheduleEdge temp = this.scheduleEdges.elementAt(i);
224 ScheduleEdge se = new ScheduleEdge(o, "new", temp.getTask(), temp.getClassDescriptor());
225 se.setSourceCNode(cn2cn.get(temp.getSourceCNode()));
226 se.setTargetCNode(cn2cn.get(temp.getTargetCNode()));
230 o.scheduleEdges = tses;
233 o.inedges = new Vector();
234 o.edges = new Vector();
240 public void merge(ScheduleEdge se) {
241 Vector<ClassNode> targetCNodes = (Vector<ClassNode>)((ScheduleNode)se.getTarget()).getClassNodes();
242 Vector<ScheduleEdge> targetSEdges = (Vector<ScheduleEdge>)((ScheduleNode)se.getTarget()).getScheduleEdges();
244 for(int i = 0; i < targetCNodes.size(); i++) {
245 targetCNodes.elementAt(i).setScheduleNode(this);
248 if(classNodes == null) {
249 classNodes = targetCNodes;
250 scheduleEdges = targetSEdges;
252 if(targetCNodes.size() != 0) {
253 classNodes.addAll(targetCNodes);
255 if(targetSEdges.size() != 0) {
256 scheduleEdges.addAll(targetSEdges);
262 scheduleEdges.add(se);
263 se.getTarget().removeInedge(se);
265 //this.addEdge(se.getTarget().getEdgeVector());
266 Iterator it_edges = se.getTarget().edges();
267 while(it_edges.hasNext()) {
268 ScheduleEdge tse = (ScheduleEdge)it_edges.next();
270 this.edges.addElement(tse);