From dc7f2ec92ea85734e6443c3aefcce14d922323b5 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Fri, 30 May 2025 15:25:18 -0400 Subject: [PATCH] fix: handle POLLERR and POLLNVAL in posix backend --- src/posix/nanoev_posix.ml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/posix/nanoev_posix.ml b/src/posix/nanoev_posix.ml index ebca1e0..f271a80 100644 --- a/src/posix/nanoev_posix.ml +++ b/src/posix/nanoev_posix.ml @@ -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