File: Test083.ML

package info (click to toggle)
polyml 5.6-8
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 31,892 kB
  • ctags: 34,453
  • sloc: cpp: 44,983; ansic: 24,520; asm: 14,850; sh: 11,730; makefile: 551; exp: 484; python: 253; awk: 91; sed: 9
file content (44 lines) | stat: -rw-r--r-- 1,583 bytes parent folder | download | duplicates (5)
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
(* Test of polling and non-blocking sockets. *)
(* Updated to the new non-blocking calls. *)
fun verify true = ()
|   verify false = raise Fail "wrong";

val x = INetSock.TCP.socket(): Socket.passive INetSock.stream_sock
and y = INetSock.TCP.socket(): Socket.active INetSock.stream_sock;
val SOME me = NetHostDB.getByName "localhost";
val localhost = NetHostDB.addr me;
Socket.bind(x, INetSock.toAddr(localhost, 0));
Socket.listen(x, 5);
Socket.acceptNB x;
val xPoll = valOf(OS.IO.pollDesc(Socket.ioDesc x)) and yPoll = valOf(OS.IO.pollDesc(Socket.ioDesc y));
fun printPoll(p, l) =
let
    open OS.IO
in
    (if isIn p then ["In"] else []) @
    (if isOut p then ["Out"] else []) @
    (if isPri p then ["Pri"] else []) @ l
end;

verify(null(List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn xPoll, OS.IO.pollOut xPoll], SOME(Time.fromSeconds 1)))));
let
    val p1 = List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn yPoll, OS.IO.pollOut yPoll], SOME(Time.fromSeconds 1)))
in
    (* This gives [] in Windows but ["Out"] on Linux*)
    verify(p1 = [] orelse p1 = ["Out"])
end;

let
val (_, port) = INetSock.fromAddr(Socket.Ctl.getSockName x)
in
Socket.connectNB(y, INetSock.toAddr(localhost, port))
end;
verify(List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn xPoll, OS.IO.pollOut xPoll], SOME(Time.fromSeconds 1))) =
    ["In"]);
verify(List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn yPoll, OS.IO.pollOut yPoll], SOME(Time.fromSeconds 1))) =
    ["Out"]);
val SOME(sock1, _) = Socket.acceptNB x;
val NONE = Socket.acceptNB x;
Socket.close sock1;
Socket.close x;
Socket.close y;