make non-waiting paths of sem_[timed]wait and pthread_join cancelable
[musl] / src / thread / sem_timedwait.c
index df5f3a6..68dcb50 100644 (file)
@@ -8,10 +8,12 @@ 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;
-       while (spins-- && sem->__val[0] <= 0) a_spin();
+       while (spins-- && sem->__val[0] <= 0 && !sem->__val[1]) a_spin();
 
        while (sem_trywait(sem)) {
                int r;