make non-waiting paths of sem_[timed]wait and pthread_join cancelable
authorRich Felker <dalias@aerifal.cx>
Fri, 5 Sep 2014 07:22:52 +0000 (03:22 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 5 Sep 2014 07:22:52 +0000 (03:22 -0400)
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
src/thread/sem_timedwait.c

index 719c91ca24f7b03f729657a27208e10e3bf1c020..abd2d668c9fea70d2eed1f5de287ee8dcc40461e 100644 (file)
@@ -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);
index b5a60addb0aa7fc398f7a9d7ea93f504d4da16ee..68dcb5044b3169ca389070be5867f509d5937956 100644 (file)
@@ -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;