- int tmp;
- pthread_testcancel();
- while ((tmp = t->tid)) __timedwait(&t->tid, tmp, 0, 0, dummy, 0, 0);
+ int tmp, cs, r = 0;
+ __pthread_testcancel();
+ __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+ if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
+ if (t->detached) a_crash();
+ while ((tmp = t->tid) && r != ETIMEDOUT && r != EINVAL)
+ r = __timedwait_cp(&t->tid, tmp, CLOCK_REALTIME, at, 0);
+ __pthread_setcancelstate(cs, 0);
+ if (r == ETIMEDOUT || r == EINVAL) return r;
+ a_barrier();