fix minor bugs due to incorrect threaded-predicate semantics
[musl] / src / thread / pthread_setcancelstate.c
index 23c3885..ba2b231 100644 (file)
@@ -2,9 +2,14 @@
 
 int pthread_setcancelstate(int new, int *old)
 {
-       struct pthread *self = pthread_self();
-       if (old) *old = self->canceldisable;
-       if ((unsigned)new > 1) return EINVAL;
-       self->canceldisable = new;
+       if (new > 1U) return EINVAL;
+       if (libc.main_thread) {
+               struct pthread *self = __pthread_self();
+               if (old) *old = self->canceldisable;
+               self->canceldisable = new;
+       } else {
+               if (old) *old = libc.canceldisable;
+               libc.canceldisable = new;
+       }
        return 0;
 }