version 1.3, 2007/02/10 21:07:52 |
version 1.4, 2007/02/15 15:49:27 |
Line 206 MUTEX_RELEASE(kmutex_t *mtx) |
|
Line 206 MUTEX_RELEASE(kmutex_t *mtx) |
|
MUTEX_GIVE(); |
MUTEX_GIVE(); |
mtx->mtx_owner = 0; |
mtx->mtx_owner = 0; |
} |
} |
|
|
|
static inline void |
|
MUTEX_CLEAR_WAITERS(kmutex_t *mtx) |
|
{ |
|
/* nothing */ |
|
} |
#endif /* __HAVE_SIMPLE_MUTEXES */ |
#endif /* __HAVE_SIMPLE_MUTEXES */ |
|
|
/* |
/* |
Line 700 mutex_vector_exit(kmutex_t *mtx) |
|
Line 706 mutex_vector_exit(kmutex_t *mtx) |
|
} |
} |
} |
} |
|
|
|
#ifndef __HAVE_SIMPLE_MUTEXES |
|
/* |
|
* mutex_wakeup: |
|
* |
|
* Support routine for mutex_exit() that wakes up all waiters. |
|
* We assume that the mutex has been released, but it need not |
|
* be. |
|
*/ |
|
void |
|
mutex_wakeup(kmutex_t *mtx) |
|
{ |
|
turnstile_t *ts; |
|
|
|
ts = turnstile_lookup(mtx); |
|
if (ts == NULL) { |
|
turnstile_exit(mtx); |
|
return; |
|
} |
|
MUTEX_CLEAR_WAITERS(mtx); |
|
turnstile_wakeup(ts, TS_WRITER_Q, TS_WAITERS(ts, TS_WRITER_Q), NULL); |
|
} |
|
#endif /* !__HAVE_SIMPLE_MUTEXES */ |
|
|
/* |
/* |
* mutex_owned: |
* mutex_owned: |
* |
* |
Line 742 mutex_tryenter(kmutex_t *mtx) |
|
Line 771 mutex_tryenter(kmutex_t *mtx) |
|
{ |
{ |
uintptr_t curthread; |
uintptr_t curthread; |
|
|
MUTEX_WANTLOCK(mtx); |
|
|
|
/* |
/* |
* Handle spin mutexes. |
* Handle spin mutexes. |
*/ |
*/ |
Line 751 mutex_tryenter(kmutex_t *mtx) |
|
Line 778 mutex_tryenter(kmutex_t *mtx) |
|
MUTEX_SPIN_SPLRAISE(mtx); |
MUTEX_SPIN_SPLRAISE(mtx); |
#ifdef FULL |
#ifdef FULL |
if (__cpu_simple_lock_try(&mtx->mtx_lock)) { |
if (__cpu_simple_lock_try(&mtx->mtx_lock)) { |
|
MUTEX_WANTLOCK(mtx); |
MUTEX_LOCKED(mtx); |
MUTEX_LOCKED(mtx); |
return 1; |
return 1; |
} |
} |
MUTEX_SPIN_SPLRESTORE(mtx); |
MUTEX_SPIN_SPLRESTORE(mtx); |
#else |
#else |
|
MUTEX_WANTLOCK(mtx); |
MUTEX_LOCKED(mtx); |
MUTEX_LOCKED(mtx); |
return 1; |
return 1; |
#endif |
#endif |
Line 763 mutex_tryenter(kmutex_t *mtx) |
|
Line 792 mutex_tryenter(kmutex_t *mtx) |
|
curthread = (uintptr_t)curlwp; |
curthread = (uintptr_t)curlwp; |
MUTEX_ASSERT(mtx, curthread != 0); |
MUTEX_ASSERT(mtx, curthread != 0); |
if (MUTEX_ACQUIRE(mtx, curthread)) { |
if (MUTEX_ACQUIRE(mtx, curthread)) { |
|
MUTEX_WANTLOCK(mtx); |
MUTEX_LOCKED(mtx); |
MUTEX_LOCKED(mtx); |
MUTEX_DASSERT(mtx, |
MUTEX_DASSERT(mtx, |
MUTEX_OWNER(mtx->mtx_owner) == curthread); |
MUTEX_OWNER(mtx->mtx_owner) == curthread); |