1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
(* Checks on the interaction between closing a stream and the underlying reader/writer. *)
val s1 = INetSock.TCP.socket();
fun closeIt () = Socket.close s1;
val primread = BinPrimIO.RD {
avail = fn _ => NONE,
block = SOME(fn _ => ()),
canInput = SOME(fn _ => true),
chunkSize = 10,
close = closeIt,
endPos = NONE,
getPos = NONE,
ioDesc = NONE,
name = "instream",
readArr = SOME (fn _ => 0),
readArrNB = NONE,
readVec = SOME(fn _ => Word8Vector.fromList []),
readVecNB = NONE,
setPos = NONE,
verifyPos = NONE
};
val reader = BinIO.StreamIO.mkInstream(primread, Word8Vector.fromList []);
(* Multiple closes should work *)
BinIO.StreamIO.closeIn reader;
BinIO.StreamIO.closeIn reader;
(closeIt(); raise Fail "Should be closed") handle OS.SysErr _ => ();
(* If close fails it should raise Io. *)
val primread = BinPrimIO.RD {
avail = fn _ => NONE,
block = SOME(fn _ => ()),
canInput = SOME(fn _ => true),
chunkSize = 10,
close = fn () => raise Fail "close failed",
endPos = NONE,
getPos = NONE,
ioDesc = NONE,
name = "instream",
readArr = SOME (fn _ => 0),
readArrNB = NONE,
readVec = SOME(fn _ => Word8Vector.fromList []),
readVecNB = NONE,
setPos = NONE,
verifyPos = NONE
};
val reader = BinIO.StreamIO.mkInstream(primread, Word8Vector.fromList []);
BinIO.StreamIO.closeIn reader handle IO.Io _ => ();
val s2 = INetSock.TCP.socket();
fun closeIt () = Socket.close s2;
val primwrite = BinPrimIO.WR {
block = SOME(fn _ => ()),
canOutput = SOME(fn _ => true),
chunkSize = 10,
close = closeIt,
endPos = NONE,
getPos = NONE,
ioDesc = NONE,
name = "outstream",
setPos = NONE,
verifyPos = NONE,
writeArr = SOME (fn _ => 0),
writeArrNB = NONE,
writeVec = SOME (fn _ => 0),
writeVecNB = NONE
};
val writer = BinIO.StreamIO.mkOutstream(primwrite, IO.NO_BUF);
BinIO.StreamIO.closeOut writer;
BinIO.StreamIO.closeOut writer;
(closeIt(); raise Fail "Should be closed") handle OS.SysErr _ => ();
|