Skip to content

Commit e409f80

Browse files
committed
Add Picos_select.await_on for convenience
1 parent 23ccf74 commit e409f80

File tree

4 files changed

+21
-18
lines changed

4 files changed

+21
-18
lines changed

lib/picos/select/picos_select.ml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,16 @@ let[@alert "-handler"] rec insert_fd s fds (Return_on r as op) =
273273
wakeup s `Alive
274274
else insert_fd s fds op
275275

276-
let return_on computation file_descr event value =
276+
let return_on computation file_descr op value =
277277
let s = get () in
278278
insert_fd s
279-
(match event with `R -> s.new_rd | `W -> s.new_wr | `E -> s.new_ex)
279+
(match op with `R -> s.new_rd | `W -> s.new_wr | `E -> s.new_ex)
280280
(Return_on { computation; file_descr; value })
281+
282+
let await_on file_descr op =
283+
let computation = Computation.create () in
284+
return_on computation file_descr op file_descr;
285+
try Computation.await computation
286+
with exn ->
287+
Computation.cancel computation exit_exn_bt;
288+
raise exn

lib/picos/select/picos_select.mli

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
open Picos
99

10+
(** {1 Timeouts} *)
11+
1012
val cancel_after : _ Computation.t -> seconds:float -> Exn_bt.t -> unit
1113
(** [cancel_after computation ~seconds exn_bt] arranges for [computation] to be
1214
{{!Picos.Computation.cancel} canceled} with given [exn_bt] after given time
@@ -16,6 +18,8 @@ val cancel_after : _ Computation.t -> seconds:float -> Exn_bt.t -> unit
1618
ℹ️ You can use [cancel_after] to implement the handler for the
1719
{{!Picos.Computation.Cancel_after} [Cancel_after]} effect. *)
1820

21+
(** {1 IO} *)
22+
1923
val return_on :
2024
'a Computation.t -> Unix.file_descr -> [ `R | `W | `E ] -> 'a -> unit
2125
(** [return_on computation file_descr op value] arranges for [computation] to be
@@ -25,3 +29,7 @@ val return_on :
2529
2630
ℹ️ Using [Unix.set_nonblock] and [return_on] you can implement direct-style
2731
transparently asynchronous IO on top of the [Unix] module. *)
32+
33+
val await_on : Unix.file_descr -> [ `R | `W | `E ] -> Unix.file_descr
34+
(** [await_on file_descr op] awaits until [file_descr] becomes available for
35+
[op]. *)

test/lib/elements/async_unix.ml

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
1-
open Picos
21
include Unix
32

4-
let await file_descr op =
5-
let c = Computation.create () in
6-
Picos_select.return_on c file_descr op file_descr;
7-
try Computation.await c
8-
with exn ->
9-
Computation.cancel c (Exn_bt.get_callstack 0 exn);
10-
raise exn
11-
123
let read file_descr bytes pos len =
134
try Unix.read file_descr bytes pos len
145
with Unix.Unix_error ((EAGAIN | EWOULDBLOCK), _, _) ->
15-
Unix.read (await file_descr `R) bytes pos len
6+
Unix.read (Picos_select.await_on file_descr `R) bytes pos len
167

178
let write file_descr bytes pos len =
189
try Unix.write file_descr bytes pos len
1910
with Unix.Unix_error ((EAGAIN | EWOULDBLOCK), _, _) ->
20-
Unix.write (await file_descr `W) bytes pos len
11+
Unix.write (Picos_select.await_on file_descr `W) bytes pos len
2112

2213
let accept ?cloexec file_descr =
2314
try Unix.accept ?cloexec file_descr
2415
with Unix.Unix_error ((EAGAIN | EWOULDBLOCK), _, _) ->
25-
Unix.accept ?cloexec (await file_descr `R)
16+
Unix.accept ?cloexec (Picos_select.await_on file_descr `R)

test/lib/elements/async_unix.mli

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
(** A transparently asynchronous [Unix] module for {!Picos}. *)
22

33
include module type of Unix
4-
5-
val await : file_descr -> [ `R | `W | `E ] -> file_descr
6-
(** [await file_descr op] awaits for [file_descr] to be ready for [op] and
7-
returns [file_descr]. *)

0 commit comments

Comments
 (0)