From patchwork Mon Feb 10 01:05:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 37836 Received: (qmail 96131 invoked by alias); 10 Feb 2020 01:05:19 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 95938 invoked by uid 89); 10 Feb 2020 01:05:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NEUTRAL autolearn=ham version=3.3.1 spammy=999999, carry, sem X-HELO: hera.aquilenet.fr From: Samuel Thibault To: libc-alpha@sourceware.org Cc: Samuel Thibault , commit-hurd@gnu.org Subject: [hurd, commited 07/10] htl: Make sem_wait/sem_timedwait interruptible Date: Mon, 10 Feb 2020 02:05:05 +0100 Message-Id: <20200210010508.428251-7-samuel.thibault@ens-lyon.org> In-Reply-To: <20200210010508.428251-1-samuel.thibault@ens-lyon.org> References: <20200210010508.428251-1-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 --- htl/Makefile | 2 ++ htl/pt-internal.h | 8 ++++++++ sysdeps/htl/sem-timedwait.c | 10 ++++------ sysdeps/mach/htl/pt-block-intr.c | 6 ++++++ sysdeps/mach/htl/pt-block.c | 19 +++++++++++++++++-- sysdeps/mach/htl/pt-timedblock-intr.c | 3 +++ sysdeps/mach/htl/pt-timedblock.c | 8 +++++++- 7 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 sysdeps/mach/htl/pt-block-intr.c create mode 100644 sysdeps/mach/htl/pt-timedblock-intr.c diff --git a/htl/Makefile b/htl/Makefile index 1b33748934..39294c64d1 100644 --- a/htl/Makefile +++ b/htl/Makefile @@ -108,6 +108,8 @@ libpthread-routines := pt-attr pt-attr-destroy pt-attr-getdetachstate \ \ pt-block \ pt-timedblock \ + pt-block-intr \ + pt-timedblock-intr \ pt-wakeup \ pt-docancel \ pt-sysdep \ diff --git a/htl/pt-internal.h b/htl/pt-internal.h index 8ffe1bd970..918c207c3e 100644 --- a/htl/pt-internal.h +++ b/htl/pt-internal.h @@ -270,6 +270,14 @@ extern error_t __pthread_timedblock (struct __pthread *__restrict thread, const struct timespec *__restrict abstime, clockid_t clock_id); +/* Block THREAD with interrupts. */ +extern error_t __pthread_block_intr (struct __pthread *thread); + +/* Block THREAD until *ABSTIME is reached, with interrupts. */ +extern error_t __pthread_timedblock_intr (struct __pthread *__restrict thread, + const struct timespec *__restrict abstime, + clockid_t clock_id); + /* Wakeup THREAD. */ extern void __pthread_wakeup (struct __pthread *thread); diff --git a/sysdeps/htl/sem-timedwait.c b/sysdeps/htl/sem-timedwait.c index 656da41184..a61acfd43f 100644 --- a/sysdeps/htl/sem-timedwait.c +++ b/sysdeps/htl/sem-timedwait.c @@ -30,6 +30,7 @@ __sem_timedwait_internal (sem_t *restrict sem, error_t err; int drain; struct __pthread *self; + clockid_t clock_id = CLOCK_REALTIME; __pthread_spin_lock (&sem->__lock); if (sem->__value > 0) @@ -54,12 +55,9 @@ __sem_timedwait_internal (sem_t *restrict sem, /* Block the thread. */ if (timeout != NULL) - err = __pthread_timedblock (self, timeout, CLOCK_REALTIME); + err = __pthread_timedblock_intr (self, timeout, clock_id); else - { - err = 0; - __pthread_block (self); - } + err = __pthread_block_intr (self); __pthread_spin_lock (&sem->__lock); if (self->prevp == NULL) @@ -82,7 +80,7 @@ __sem_timedwait_internal (sem_t *restrict sem, if (err) { - assert (err == ETIMEDOUT); + assert (err == ETIMEDOUT || err == EINTR); errno = err; return -1; } diff --git a/sysdeps/mach/htl/pt-block-intr.c b/sysdeps/mach/htl/pt-block-intr.c new file mode 100644 index 0000000000..f15beb3a0f --- /dev/null +++ b/sysdeps/mach/htl/pt-block-intr.c @@ -0,0 +1,6 @@ +#include +#define RETTYPE error_t +#define RETURN(val) return val +#define __pthread_block __pthread_block_intr +#define MSG_OPTIONS MACH_RCV_INTERRUPT +#include "pt-block.c" diff --git a/sysdeps/mach/htl/pt-block.c b/sysdeps/mach/htl/pt-block.c index e1500dce33..28bae157d1 100644 --- a/sysdeps/mach/htl/pt-block.c +++ b/sysdeps/mach/htl/pt-block.c @@ -24,15 +24,30 @@ #include +#ifndef MSG_OPTIONS +# define MSG_OPTIONS 0 +#endif + +#ifndef RETTYPE +# define RETTYPE void +#endif + +#ifndef RETURN +# define RETURN(val) +#endif + /* Block THREAD. */ -void +RETTYPE __pthread_block (struct __pthread *thread) { mach_msg_header_t msg; error_t err; - err = __mach_msg (&msg, MACH_RCV_MSG, 0, sizeof msg, + err = __mach_msg (&msg, MACH_RCV_MSG | MSG_OPTIONS, 0, sizeof msg, thread->wakeupmsg.msgh_remote_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if ((MSG_OPTIONS & MACH_RCV_INTERRUPT) && err == MACH_RCV_INTERRUPTED) + RETURN(EINTR); assert_perror (err); + RETURN(0); } diff --git a/sysdeps/mach/htl/pt-timedblock-intr.c b/sysdeps/mach/htl/pt-timedblock-intr.c new file mode 100644 index 0000000000..70e132716b --- /dev/null +++ b/sysdeps/mach/htl/pt-timedblock-intr.c @@ -0,0 +1,3 @@ +#define __pthread_timedblock __pthread_timedblock_intr +#define MSG_OPTIONS MACH_RCV_INTERRUPT +#include "pt-timedblock.c" diff --git a/sysdeps/mach/htl/pt-timedblock.c b/sysdeps/mach/htl/pt-timedblock.c index 63af869c90..ead070e397 100644 --- a/sysdeps/mach/htl/pt-timedblock.c +++ b/sysdeps/mach/htl/pt-timedblock.c @@ -26,6 +26,10 @@ #include +#ifndef MSG_OPTIONS +# define MSG_OPTIONS 0 +#endif + /* Block THREAD. */ error_t __pthread_timedblock (struct __pthread *thread, @@ -54,11 +58,13 @@ __pthread_timedblock (struct __pthread *thread, /* Need to do a carry. */ timeout -= (now.tv_nsec - abstime->tv_nsec + 999999) / 1000000; - err = __mach_msg (&msg, MACH_RCV_MSG | MACH_RCV_TIMEOUT, 0, + err = __mach_msg (&msg, MACH_RCV_MSG | MACH_RCV_TIMEOUT | MSG_OPTIONS, 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; assert_perror (err); return 0;