diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-02-07 22:13:46 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-02-07 22:13:46 +0100 |
commit | a9a002fb6cb9941ba283ef832e2a88ab00033683 (patch) | |
tree | 83f16a823d5a59fa241b209408962b3979bf82af /hurd/hurdselect.c | |
parent | bd959902bcb2e71b4f3ac72535c4d2fe86f4ce79 (diff) | |
download | glibc-a9a002fb6cb9941ba283ef832e2a88ab00033683.zip glibc-a9a002fb6cb9941ba283ef832e2a88ab00033683.tar.gz glibc-a9a002fb6cb9941ba283ef832e2a88ab00033683.tar.bz2 |
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.
Diffstat (limited to 'hurd/hurdselect.c')
-rw-r--r-- | hurd/hurdselect.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c index 2996be2..bd31c94 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 |