Upstream status: https://lists.gnu.org/archive/html/bug-hurd/2025-12/msg00043.html From ffe82c73f89d12393c62d5ba35b06552af40e029 Mon Sep 17 00:00:00 2001 From: Yelninei Date: Sun, 28 Dec 2025 10:59:56 +0000 Subject: [PATCH 1/2] streamio (io_select_common): Don't return in case of O_NONBLOCK. select should block even when opened with O_NONBLOCK. --- trans/streamio.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/trans/streamio.c b/trans/streamio.c index d21dc937..2a48d793 100644 --- a/trans/streamio.c +++ b/trans/streamio.c @@ -589,12 +589,6 @@ io_select_common (struct trivfs_protid *cred, return 0; } - if (cred->po->openmodes & O_NONBLOCK) - { - pthread_mutex_unlock (&global_lock); - return EWOULDBLOCK; - } - ports_interrupt_self_on_port_death (cred, reply); err = pthread_hurd_cond_timedwait_np (&select_alert, &global_lock, tsp); if (err) -- 2.52.0 From 090062ef555ffc29bcb7afcaad5bb46dad5973e9 Mon Sep 17 00:00:00 2001 From: Yelninei Date: Sun, 28 Dec 2025 11:03:57 +0000 Subject: [PATCH 2/2] streamio (io_select_common): Request data if none is available. If no data is available immediately start new read/write requests. --- trans/streamio.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/trans/streamio.c b/trans/streamio.c index 2a48d793..f7cd442f 100644 --- a/trans/streamio.c +++ b/trans/streamio.c @@ -190,6 +190,8 @@ error_t dev_write (const void *buf, size_t len, size_t *amount, int nowait); will wait for any activity to cease. */ error_t dev_sync (int wait); +static error_t start_input (int nowait); +static error_t start_output (int nowait); static struct argp_option options[] = @@ -589,6 +591,27 @@ io_select_common (struct trivfs_protid *cred, return 0; } + if (*type & SELECT_READ) + { + err = start_input(1); + if (err) + { + *type = 0; + pthread_mutex_unlock (&global_lock); + return err; + } + } + if (*type & SELECT_WRITE) + { + err = start_output(1); + if (err) + { + *type = 0; + pthread_mutex_unlock (&global_lock); + return err; + } + } + ports_interrupt_self_on_port_death (cred, reply); err = pthread_hurd_cond_timedwait_np (&select_alert, &global_lock, tsp); if (err) -- 2.52.0