add DockInputStream, DockOutputStream
[fleet.git] / src / edu / berkeley / fleet / loops / DockInputStream.java
1 package edu.berkeley.fleet.loops;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
4 import java.io.*;
5
6 public class DockInputStream {
7     private FleetProcess fp;
8     private ShipPool pool;
9     private Dock dock;
10     private int inflight;
11
12     public DockInputStream(FleetProcess fp,
13                            ShipPool pool,
14                            Dock dock,
15                            Destination sendTokenTo,
16                            int inflight) throws IOException {
17
18         if (fp.getFleet() != dock.getShip().getFleet())
19             throw new RuntimeException("Fleet mismatch");
20         this.fp = fp;
21         this.pool = pool;
22         this.dock = dock;
23         this.inflight = inflight;
24         pool.assertAllocated(dock.getShip());
25         pool.allocateShip(fp.getDebugInputDock().getShip());
26
27         CodeBag cb = new CodeBag(fp.getFleet());
28
29         LoopFactory lf;
30         lf = cb.loopFactory(dock, 0);
31         lf.abortLoopIfTorpedoPresent();
32         lf.collectWord();
33         lf.sendWord(fp.getDebugInputDock());
34
35         if (sendTokenTo!=null) {
36             lf = cb.loopFactory(fp.getDebugInputDock(), inflight);
37             lf.sendToken(sendTokenTo);
38             lf = lf.makeNext(0);
39         } else {
40             lf = cb.loopFactory(fp.getDebugInputDock(), 0);
41         }
42         lf.abortLoopIfTorpedoPresent();
43         lf.recvWord();
44         lf.deliver();
45         if (sendTokenTo!=null) lf.sendToken(sendTokenTo);
46
47         cb.dispatch(fp);
48     }
49
50     public BitVector readWord() {
51         return fp.recvWord();
52     }
53
54     public void close() {
55         CodeBag cb = new CodeBag(fp.getFleet());
56         LoopFactory lf;
57         lf = cb.loopFactory(fp.getDebugInputDock(), 1);
58
59         fp.sendTorpedo(fp.getDebugInputDock());
60         fp.flush();
61         for(int i=0; i<inflight; i++) // FIXME: use a loop counter here
62             lf.recvWord();
63         lf.deliver();
64
65         cb.dispatch(fp);
66         fp.flush();
67         fp.recvWord();
68
69         fp.sendTorpedo(dock);
70         pool.releaseShip(fp.getDebugInputDock().getShip());
71     }
72 }