private void updateMonitor(MonitorSet ms, Object unit) { // System.out.println("===inside updateMonitor==="); // ml.test(); Iterator it = ms.iterator(); while (it.hasNext()) { Object obj = it.next(); if (obj instanceof MonitorDepth) { MonitorDepth md = (MonitorDepth) obj; String objName = md.getObjName(); if (monitor.containsKey(objName)) { if (md.getDepth() > 0) { monitor.get(objName).add(unit); // System.out.println("add to monitorset "+unit); } } else { FlowSet monitorObjs = new ArraySparseSet(); monitorObjs.add(unit); monitor.put(objName, monitorObjs); // System.out.println("put into monitor: "+objName); } } } }
// STEP 5: Define flow equations. // in(s) = ( out(s) minus defs(s) ) union uses(s) // protected void flowThrough(Object inValue, Object unit, Object outValue) { MonitorSet in = (MonitorSet) inValue; MonitorSet out = (MonitorSet) outValue; JPegStmt s = (JPegStmt) unit; Tag tag = (Tag) s.getTags().get(0); // System.out.println("s: "+tag+" "+s); // Copy in to out // if (in.contains("&")) in.remove("&"); in.copy(out); // System.out.println("-----in: "); // in.test(); if (in.size() > 0) { if (!s.getName().equals("waiting") && !s.getName().equals("notified-entry")) updateMonitor(in, unit); } String objName = s.getObject(); // if (objName == null) throw new RuntimeException("null object: "+s.getUnit()); if (s.getName().equals("entry") || s.getName().equals("exit")) { if (out.contains("&")) out.remove("&"); Object obj = out.getMonitorDepth(objName); if (obj == null) { if (s.getName().equals("entry")) { MonitorDepth md = new MonitorDepth(objName, 1); out.add(md); // System.out.println("add to out: "+md.getObjName()+" "+md.getDepth()); } /* else{ throw new RuntimeException("The monitor depth can not be decreased at "+ (Tag)((JPegStmt)s).getTags().get(0)+" "+unit); } */ } else { // System.out.println("obj: "+obj); if (obj instanceof MonitorDepth) { MonitorDepth md = (MonitorDepth) obj; if (s.getName().equals("entry")) { md.increaseDepth(); // System.out.println("===increase depth==="); } else { if (md.getDepth() > 1) { // System.out.println("===decrease depth=="); md.decreaseDepth(); } else if (md.getDepth() == 1) { // System.out.println("===remove monitordepth: "+md); out.remove(md); } else throw new RuntimeException("The monitor depth can not be decreased at " + unit); } } else throw new RuntimeException("MonitorSet contains non MonitorDepth element!"); } } // System.out.println("-----out: "+out); // out.test(); // testForDebug(); }