hurdselect: Let select get interrupted by signals
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 7 Feb 2015 21:13:46 +0000 (22:13 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 7 Feb 2015 21:13:46 +0000 (22:13 +0100)
We need to set MACH_RCV_INTERRUPT to avoid __mach_msg just looping on signals,
and then we can handle the interruption.

ChangeLog
hurd/hurdselect.c

index 03a987a..5081237 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -17,6 +17,8 @@
        * hurd/hurd/resource.h (MACH_PRIORITY_TO_NICE,
        NICE_TO_MACH_PRIORITY): Align nice levels on Mach priorities from 5 to
        45.
+       * hurd/hurdselect.c (_hurd_select): Pass MACH_RCV_INTERRUPT to
+       __mach_msg.  If that returns MACH_RCV_INTERRUPTED, set ERR to EINTR.
 
 2015-02-06  Roland McGrath  <roland@hack.frob.com>
 
index 2996be2..bd31c94 100644 (file)
@@ -335,7 +335,7 @@ _hurd_select (int nfds,
       mach_msg_option_t options = (timeout == NULL ? 0 : MACH_RCV_TIMEOUT);
       error_t msgerr;
       while ((msgerr = __mach_msg (&msg.head,
-                                  MACH_RCV_MSG | options,
+                                  MACH_RCV_MSG | MACH_RCV_INTERRUPT | options,
                                   0, sizeof msg, portset, to,
                                   MACH_PORT_NULL)) == MACH_MSG_SUCCESS)
        {
@@ -414,6 +414,9 @@ _hurd_select (int nfds,
           effect a poll, so ERR is MACH_RCV_TIMED_OUT when the poll finds no
           message waiting.  */
        err = 0;
+      if (msgerr == MACH_RCV_INTERRUPTED)
+       /* Interruption on our side (e.g. signal reception).  */
+       err = EINTR;
 
       if (got)
        /* At least one descriptor is known to be ready now, so we will