fix: handle POLLERR and POLLNVAL in posix backend
Some checks failed
github pages / Deploy doc (push) Has been cancelled
Build and Test / build (push) Has been cancelled
Build and Test / format (push) Has been cancelled

This commit is contained in:
Simon Cruanes 2025-05-30 15:25:18 -04:00
parent 8e809c8b8f
commit dc7f2ec92e
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -382,12 +382,32 @@ let step (self : st) : unit =
try Fd_tbl.find self.fds fd with Not_found -> assert false
in
(* errors *)
if Flags.mem Flags.pollnval flags || Flags.mem Flags.pollerr flags then (
(* pollerr: error
pollnval: fd is invalid, which we take as meaning that it's been closed. *)
let r = fd_data.r in
fd_data.r <- Nil;
perform_cbs ~closed:true r;
let r = fd_data.r in
fd_data.r <- Nil;
perform_cbs ~closed:true r
);
(* reads *)
if Flags.mem Flags.pollin flags then (
let r = fd_data.r in
fd_data.r <- Nil;
perform_cbs ~closed:false r
);
if Flags.mem Flags.pollout flags then (
(* writes *)
if Flags.mem Flags.pollhup flags then (
(* incompatible with pollout *)
let r = fd_data.w in
fd_data.w <- Nil;
perform_cbs ~closed:false r
) else if Flags.mem Flags.pollout flags then (
let w = fd_data.w in
fd_data.w <- Nil;
perform_cbs ~closed:false w