X-Git-Url: http://git.megacz.com/?p=fleet.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Ffleet%2Finterpreter%2FInterpreterShip.java;h=85358fa03b0eda6871fd311569d05cbe0162de60;hp=83fdaecf89ba7b81124d9044ee571c327eaaf807;hb=b0f472a8a5a902f62cfa037290166e443ad0c6b4;hpb=ce7f6e9ee7ae394dca3ff57c9f50846ce49eb5fe diff --git a/src/edu/berkeley/fleet/interpreter/InterpreterShip.java b/src/edu/berkeley/fleet/interpreter/InterpreterShip.java index 83fdaec..85358fa 100644 --- a/src/edu/berkeley/fleet/interpreter/InterpreterShip.java +++ b/src/edu/berkeley/fleet/interpreter/InterpreterShip.java @@ -1,34 +1,22 @@ + package edu.berkeley.fleet.interpreter; import edu.berkeley.fleet.api.*; -import edu.berkeley.fleet.doc.*; +import edu.berkeley.fleet.two.*; import java.util.*; import java.io.*; -/** a ship, which belongs to a fleet and which may have many ports */ -abstract class InterpreterShip extends Ship { +/** a ship, which belongs to a fleet and which may have many docks */ +abstract class InterpreterShip extends FleetTwoShip { + LinkedHashMap docks = new LinkedHashMap(); + /** You should instantiate a bunch of Inboxes and Outboxes in your constructor */ - public InterpreterShip(Interpreter fleet, String name, String type) { - this.fleet = fleet; - this.type = type; + public InterpreterShip(Interpreter fleet, ShipDescription sd) { + super(fleet, sd); } - private Interpreter fleet; - private String type; - private HashMap ports = new HashMap(); - - public Iterable getPumps() { return (Iterable)(Object)ports.values(); } - public String getType() { return type; } - public Fleet getFleet() { return fleet; } - public Interpreter getInterpreter() { return fleet; } - - public void setShipDescription(ShipDescription sd) { - for(InterpreterPump ibb : ports.values()) { - for(PumpDescription bbd : sd) { - if (bbd.getName().equals(ibb.getName())) - ibb.setDescription(bbd); - } - } + public Iterator iterator() { + return (Iterator)(Object)docks.values().iterator(); } /** @@ -39,16 +27,39 @@ abstract class InterpreterShip extends Ship { public abstract void service(); public final void _service() { - for(InterpreterPump p : ports.values()) p.service(); + + // service all the docks + for(InterpreterDock p : docks.values()) p.service(); + + // flushing logic (must come between dock servicing and subclass) + boolean someflushing = false; + boolean allflushing = true; + boolean someempty = false; + for(InterpreterDock d : docks.values()) { + if (!d.isInputDock()) continue; + if (d.flushing) someflushing = true; + else allflushing = false; + if (!d.flushing && !d.dataReadyForShip) someempty = true; + } + if (allflushing && someflushing) { + for(InterpreterDock d : docks.values()) + if (d.isInputDock()) + d.flushing = false; + return; + } else if (someflushing && !someempty) { + for(InterpreterDock d : docks.values()) + if (d.isInputDock() && !d.flushing && d.dataReadyForShip) + d.dataReadyForShip = false; + } + + // now pass control to the subclass service(); } - protected void addPump(String name, InterpreterPump port) { - ports.put(name, port); + public void reset() { + for(InterpreterDock p : docks.values()) + p.reset(); } - public void shutdown() { - for(InterpreterPump p : ports.values()) - p.shutdown(); - } + public Interpreter getInterpreter() { return (Interpreter)getFleet(); } }