Source file system_unix.ml
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
open Lwt.Infix
module Preemptive = Lwt_preemptive
module Unix = struct
type file_descr = Lwt_unix.file_descr
let wrap_fd f fd = f (Lwt_unix.of_unix_file_descr fd)
let poll ~stdenv:() ?(read = false) ?(write = false) ?timeout fd =
let choices = []
|> (fun acc -> if read then Lwt_unix.wait_read fd :: acc else acc)
|> (fun acc -> if write then Lwt_unix.wait_write fd :: acc else acc)
|> Option.fold
~none:Fun.id ~some:(fun t acc -> Lwt_unix.timeout t :: acc) timeout
in
if choices = [] then
Lwt.fail_invalid_arg "Caqti_lwt.Unix.poll: No operation specified."
else
Lwt.catch
(fun () -> Lwt.choose choices >|= fun _ -> false)
(function
| Lwt_unix.Timeout -> Lwt.return_true
| exn -> Lwt.fail exn)
>|= fun timed_out ->
(Lwt_unix.readable fd, Lwt_unix.writable fd, timed_out)
end