From 829970b29fa73cdfdc0a5e229411c2f31cf4a3fb Mon Sep 17 00:00:00 2001 From: Joan Lledó Date: Sat, 11 Aug 2018 18:17:09 +0200 Subject: lwip: return EINTR when a select() IPC thread is cancelled Needed to properly support poll in glibc (_hurd_select). * lwip/io-ops.c (lwip_io_select_common): Detect when the current RPC is cancelled by checking the reply port. --- lwip/io-ops.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'lwip') diff --git a/lwip/io-ops.c b/lwip/io-ops.c index 1429bc55..72e08e26 100644 --- a/lwip/io-ops.c +++ b/lwip/io-ops.c @@ -198,6 +198,8 @@ lwip_io_select_common (struct sock_user *user, int timeout; struct pollfd fdp; nfds_t nfds; + mach_port_type_t type; + error_t err; if (!user) return EOPNOTSUPP; @@ -227,6 +229,12 @@ lwip_io_select_common (struct sock_user *user, timeout = tv ? tv->tv_sec * 1000 + tv->tv_nsec / 1000000 : -1; ret = lwip_poll (&fdp, nfds, timeout); + err = mach_port_type (mach_task_self (), reply, &type); + if (err || (type & MACH_PORT_TYPE_DEAD_NAME)) + /* The reply port is dead, we were cancelled */ + return EINTR; + + if (ret > 0) { if (fdp.revents & POLLERR) -- cgit v1.2.3