From fff546930347d99729f1c0a9d911e7f24a094531 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 5 Sep 2014 03:22:52 -0400 Subject: make non-waiting paths of sem_[timed]wait and pthread_join cancelable per POSIX these functions are both cancellation points, so they must act on any cancellation request which is pending prior to the call. previously, only the code path where actual waiting took place could act on cancellation. --- src/thread/pthread_join.c | 1 + src/thread/sem_timedwait.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/thread/pthread_join.c b/src/thread/pthread_join.c index 719c91ca..abd2d668 100644 --- a/src/thread/pthread_join.c +++ b/src/thread/pthread_join.c @@ -8,6 +8,7 @@ static void dummy(void *p) int pthread_join(pthread_t t, void **res) { int tmp; + pthread_testcancel(); while ((tmp = t->tid)) __timedwait(&t->tid, tmp, 0, 0, dummy, 0, 0); if (res) *res = t->result; if (t->map_base) munmap(t->map_base, t->map_size); diff --git a/src/thread/sem_timedwait.c b/src/thread/sem_timedwait.c index b5a60add..68dcb504 100644 --- a/src/thread/sem_timedwait.c +++ b/src/thread/sem_timedwait.c @@ -8,6 +8,8 @@ static void cleanup(void *p) int sem_timedwait(sem_t *restrict sem, const struct timespec *restrict at) { + pthread_testcancel(); + if (!sem_trywait(sem)) return 0; int spins = 100; -- cgit v1.2.1