version 1.5.2.2, 2007/02/26 09:08:40 |
version 1.5.2.3, 2007/09/03 14:30:49 |
|
|
* an interlocking step. |
* an interlocking step. |
*/ |
*/ |
|
|
|
#ifndef LOCKDEBUG |
|
#define MUTEX_COUNT_BIAS 1 |
|
#endif |
|
|
#ifndef __MUTEX_PRIVATE |
#ifndef __MUTEX_PRIVATE |
|
|
struct kmutex { |
struct kmutex { |
uintptr_t mtx_pad1; |
uintptr_t mtx_pad1; |
uint32_t mtx_pad2[2]; |
uint32_t mtx_pad2; |
}; |
}; |
|
|
#else /* __MUTEX_PRIVATE */ |
#else /* __MUTEX_PRIVATE */ |
|
|
struct kmutex { |
struct kmutex { |
/* Adaptive mutex */ |
/* Adaptive mutex */ |
union { |
union { |
volatile uintptr_t mtxu_owner; /* 0-3 */ |
volatile uintptr_t u_owner; /* 0-3 */ |
__cpu_simple_lock_t mtxu_lock; /* 0 */ |
struct { |
|
uint8_t s_dummylo; /* 0 */ |
|
__cpu_simple_lock_t s_lock; /* 1 */ |
|
ipl_cookie_t s_ipl; /* 2 */ |
|
uint8_t s_dummyhi; /* 3 */ |
|
} u_s; |
} mtx_u; |
} mtx_u; |
ipl_cookie_t mtx_ipl; /* 4-7 */ |
uint32_t mtx_id; /* 4-7 */ |
uint32_t mtx_id; /* 8-11 */ |
|
}; |
}; |
#define mtx_owner mtx_u.mtxu_owner |
#define mtx_owner mtx_u.u_owner |
#define mtx_lock mtx_u.mtxu_lock |
#define mtx_lock mtx_u.u_s.s_lock |
|
#define mtx_ipl mtx_u.u_s.s_ipl |
|
|
#define __HAVE_MUTEX_STUBS 1 |
#define __HAVE_MUTEX_STUBS 1 |
#define __HAVE_SPIN_MUTEX_STUBS 1 |
#define __HAVE_SPIN_MUTEX_STUBS 1 |
|
|
#define MUTEX_NO_SPIN_ACTIVE_P(ci) ((ci)->ci_mtx_count == 1) |
|
|
|
static inline uintptr_t |
static inline uintptr_t |
MUTEX_OWNER(uintptr_t owner) |
MUTEX_OWNER(uintptr_t owner) |
{ |
{ |
Line 143 static inline void |
|
Line 150 static inline void |
|
MUTEX_INITIALIZE_SPIN(kmutex_t *mtx, u_int id, int ipl) |
MUTEX_INITIALIZE_SPIN(kmutex_t *mtx, u_int id, int ipl) |
{ |
{ |
mtx->mtx_id = (id << 1) | 1; |
mtx->mtx_id = (id << 1) | 1; |
|
mtx->mtx_owner = 0x80000000; |
mtx->mtx_ipl = makeiplcookie(ipl); |
mtx->mtx_ipl = makeiplcookie(ipl); |
mtx->mtx_lock = 0; |
mtx->mtx_lock = 0; |
} |
} |
Line 165 MUTEX_DESTROY(kmutex_t *mtx) |
|
Line 173 MUTEX_DESTROY(kmutex_t *mtx) |
|
static inline u_int |
static inline u_int |
MUTEX_GETID(volatile kmutex_t *mtx) |
MUTEX_GETID(volatile kmutex_t *mtx) |
{ |
{ |
return (mtx)->mtx_id >> 1; |
return mtx->mtx_id >> 1; |
} |
} |
|
|
static inline bool |
static inline bool |
Line 188 MUTEX_ACQUIRE(kmutex_t *mtx, uintptr_t c |
|
Line 196 MUTEX_ACQUIRE(kmutex_t *mtx, uintptr_t c |
|
"clrl %1;" |
"clrl %1;" |
"bbssi $31,%0,1f;" |
"bbssi $31,%0,1f;" |
"incl %1;" |
"incl %1;" |
"insv %2,%0,$31,%0;" |
"insv %2,$0,$31,%0;" |
"1:" |
"1:" |
: "=m"(mtx->mtx_owner), "=r"(rv) |
: "=m"(mtx->mtx_owner), "=r"(rv) |
: "g"(curthread)); |
: "g"(curthread)); |