struct uthread * ut;
int sig, catch;
int error = 0;
- int dropmutex;
+ int dropmutex, spinmutex;
ut = get_bsdthread_info(self);
catch = ut->uu_pri & PCATCH;
dropmutex = ut->uu_pri & PDROP;
+ spinmutex = ut->uu_pri & PSPIN;
switch (wresult) {
case THREAD_TIMED_OUT:
if (error == EINTR || error == ERESTART)
act_set_astbsd(self);
- if (ut->uu_mtx && !dropmutex)
- lck_mtx_lock(ut->uu_mtx);
-
+ if (ut->uu_mtx && !dropmutex) {
+ if (spinmutex)
+ lck_mtx_lock_spin(ut->uu_mtx);
+ else
+ lck_mtx_lock(ut->uu_mtx);
+ }
ut->uu_wchan = NULL;
ut->uu_wmesg = NULL;
struct uthread * ut;
int sig, catch = pri & PCATCH;
int dropmutex = pri & PDROP;
+ int spinmutex = pri & PSPIN;
int wait_result;
int error = 0;
p->p_priority = pri & PRIMASK;
/* It can still block in proc_exit() after the teardown. */
if (p->p_stats != NULL)
- OSIncrementAtomic(&p->p_stats->p_ru.ru_nvcsw);
+ OSIncrementAtomicLong(&p->p_stats->p_ru.ru_nvcsw);
/* set wait message & channel */
ut->uu_wchan = chan;
error = EINTR;
else
error = ERESTART;
- if (mtx && !dropmutex)
- lck_mtx_lock(mtx);
+ if (mtx && !dropmutex) {
+ if (spinmutex)
+ lck_mtx_lock_spin(mtx);
+ else
+ lck_mtx_lock(mtx);
+ }
goto out;
}
}
goto block;
error = EINTR;
- if (mtx && !dropmutex)
- lck_mtx_lock(mtx);
+ if (mtx && !dropmutex) {
+ if (spinmutex)
+ lck_mtx_lock_spin(mtx);
+ else
+ lck_mtx_lock(mtx);
+ }
goto out;
}
}
wait_result = thread_block(THREAD_CONTINUE_NULL);
- if (mtx && !dropmutex)
- lck_mtx_lock(mtx);
+ if (mtx && !dropmutex) {
+ if (spinmutex)
+ lck_mtx_lock_spin(mtx);
+ else
+ lck_mtx_lock(mtx);
+ }
}
switch (wait_result) {
if (thread_should_abort(self)) {
error = EINTR;
}
- }
+ } else if( (ut->uu_flag & ( UT_CANCELDISABLE | UT_CANCEL | UT_CANCELED)) == UT_CANCEL) {
+ /* due to thread cancel */
+ error = EINTR;
+ }
} else
error = EINTR;
break;