Ejemplo n.º 1
0
/*
 * Inline followup when releasing a mutex.  The mutex has been released
 * but 'v' either doesn't match id or needs a wakeup.
 */
void
__thr_umtx_unlock(volatile umtx_t *mtx, int v, int id)
{
	if (v & 0x40000000) {
		_umtx_wakeup_err(mtx, 0);
		v &= 0x3FFFFFFF;
	}
	THR_ASSERT(v == id, "thr_umtx_unlock: wrong owner");
}
Ejemplo n.º 2
0
void
__thr_umtx_unlock(volatile umtx_t *mtx)
{
	int v;

	for (;;) {
		v = *mtx;
		if (atomic_cmpset_acq_int(mtx, v, v-1)) {
			if (v != 1) {
				*mtx = 0;
				_umtx_wakeup_err(mtx, 1);
			}
			break;
		}
	}
}
Ejemplo n.º 3
0
void
_thr_umtx_wake(volatile umtx_t *mtx, int count)
{
	_umtx_wakeup_err(mtx, count);
}