picos: simplify a bit read/write retry loops

This commit is contained in:
Simon Cruanes 2025-05-01 13:22:45 -04:00
parent 34a1cc1769
commit bd983a395c
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -85,33 +85,29 @@ let[@inline] unwrap_ = function
| None -> ()
| Some (exn, bt) -> Printexc.raise_with_backtrace exn bt
let retry_read_ fd f =
let ev = get_loop_exn_ () in
let[@unroll 1] rec loop () =
let[@unroll 1] rec retry_read_ fd f =
match f () with
| res -> res
| exception
Unix.Unix_error ((Unix.EAGAIN | Unix.EWOULDBLOCK | Unix.EINTR), _, _) ->
Trace_.message "read must wait";
(* Trace_.message "read must wait"; *)
let trigger = Picos.Trigger.create () in
let closed_r = ref false in
let ev = get_loop_exn_ () in
Nanoev.on_readable ev fd trigger closed_r (fun ~closed trigger closed_r ->
closed_r := closed;
Picos.Trigger.signal trigger);
Picos.Trigger.await trigger |> unwrap_;
if !closed_r then raise Closed;
loop ()
in
loop ()
retry_read_ fd f
let retry_write_ fd f =
let ev = get_loop_exn_ () in
let rec loop () =
let[@unroll 1] rec retry_write_ fd f =
match f () with
| res -> res
| exception
Unix.Unix_error ((Unix.EAGAIN | Unix.EWOULDBLOCK | Unix.EINTR), _, _) ->
Trace_.message "write must wait";
(* Trace_.message "write must wait"; *)
let ev = get_loop_exn_ () in
let trigger = Picos.Trigger.create () in
let closed_r = ref false in
Nanoev.on_writable ev fd trigger closed_r (fun ~closed trigger closed_r ->
@ -119,14 +115,12 @@ let retry_write_ fd f =
Picos.Trigger.signal trigger);
Picos.Trigger.await trigger |> unwrap_;
if !closed_r then raise Closed;
loop ()
in
loop ()
retry_write_ fd f
let read fd buf i len : int =
try
retry_read_ fd (fun () ->
Trace_.message "read";
(* Trace_.message "read"; *)
Unix.read fd buf i len)
with Closed -> 0
@ -138,7 +132,7 @@ let close fd =
let accept fd =
try
retry_read_ fd (fun () ->
Trace_.message "accept";
(* Trace_.message "accept"; *)
Unix.accept fd)
with Unix.Unix_error ((Unix.ESHUTDOWN | Unix.ECONNABORTED), _, _) ->
raise Closed
@ -146,7 +140,7 @@ let accept fd =
let write fd buf i len : int =
try
retry_write_ fd (fun () ->
Trace_.message "write";
(* Trace_.message "write"; *)
Unix.write fd buf i len)
with Closed -> 0