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;
}