From: Samuel Thibault Date: Sat, 7 Feb 2015 21:13:46 +0000 (+0100) Subject: hurdselect: Let select get interrupted by signals X-Git-Tag: glibc-2.22~639 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a9a002fb6cb9941ba283ef832e2a88ab00033683;p=thirdparty%2Fglibc.git hurdselect: Let select get interrupted by signals We need to set MACH_RCV_INTERRUPT to avoid __mach_msg just looping on signals, and then we can handle the interruption. --- diff --git a/ChangeLog b/ChangeLog index 03a987aa9e1..5081237ce52 100644 --- 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 diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c index 2996be2c8b7..bd31c94aae7 100644 --- a/hurd/hurdselect.c +++ b/hurd/hurdselect.c @@ -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