Re: [PATCH glibc-2.44] Fix __pthread_timedblock for hurd

Samuel Thibault <[email protected]>
Newsgroups gmane.os.hurd.bugs
Organization I am not organized
Message-ID <aoq6i-Nk0ClHP2C6@end>
Samuel Thibault, le dim. 23 août 2026 11:11:52 +0200, a ecrit:
> Samuel Thibault, le dim. 23 août 2026 10:24:52 +0200, a ecrit:
> > One thing that is a bug, however, is the program below, which stays
> > blocked because the mach_msg calling loop keeps using the same timeout.
> > 
> > We probably need a version that takes a clock_id and an absolute time,
> > and does the clock_gettime call itself on each mach_msg calling loop.
> 
> Or probably simpler: make __pthread_timedblock always pass
> MACH_RCV_INTERRUPT to __mach_msg, but loop around if it returns EINTR
> and MACH_RCV_INTERRUPT was not in MSG_OPTIONS.

Could you try this?

Samuel
patch (text/plain, 1.2 KB)
Index: glibc-2.43/sysdeps/mach/htl/pt-timedblock.c
===================================================================
--- glibc-2.43.orig/sysdeps/mach/htl/pt-timedblock.c
+++ glibc-2.43/sysdeps/mach/htl/pt-timedblock.c
@@ -40,6 +40,7 @@ __pthread_timedblock (struct __pthread *
   mach_msg_timeout_t timeout;
   struct timespec now;
 
+retry:
   /* We have an absolute time and now we have to convert it to a
      relative time.  Arg.  */
 
@@ -58,13 +59,19 @@ __pthread_timedblock (struct __pthread *
     /* Need to do a carry.  */
     timeout -= (now.tv_nsec - abstime->tv_nsec + 999999) / 1000000;
 
-  err = __mach_msg (&msg, MACH_RCV_MSG | MACH_RCV_TIMEOUT | MSG_OPTIONS, 0,
+  err = __mach_msg (&msg, MACH_RCV_MSG | MACH_RCV_TIMEOUT | MSG_OPTIONS | MACH_RCV_INTERRUPT, 0,
 		    sizeof msg, thread->wakeupmsg.msgh_remote_port,
 		    timeout, MACH_PORT_NULL);
   if (err == EMACH_RCV_TIMED_OUT)
     return ETIMEDOUT;
-  if ((MSG_OPTIONS & MACH_RCV_INTERRUPT) && err == MACH_RCV_INTERRUPTED)
-    return EINTR;
+  if (err == MACH_RCV_INTERRUPTED)
+    {
+      if (!((MSG_OPTIONS & MACH_RCV_INTERRUPT)))
+	/* Re-take absolute time target. */
+	goto retry;
+      else
+	return EINTR;
+    }
 
   assert_perror (err);
   return 0;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.