NAME
mutex
, mtx_init
,
mtx_enter
, mtx_enter_try
,
mtx_leave
—
interface to CPU mutexes
SYNOPSIS
#include
<sys/mutex.h>
void
mtx_init
(struct
mutex *mtxp, int
wantipl);
void
mtx_enter
(struct
mutex *mtxp);
int
mtx_enter_try
(struct
mutex *mtxp);
void
mtx_leave
(struct
mutex *mtxp);
MUTEX_ASSERT_LOCKED
(struct
mutex *mtxp);
MUTEX_ASSERT_UNLOCKED
(struct
mutex *mtxp);
DESCRIPTION
The mutex
set of functions provides a
non-recursive, interrupt-aware spinning mechanism to ensure mutual exclusion
between different CPUs.
The
mtx_init
()
function is used to initiate the mutex pointed to by
mtxp. When acquired, the mutex will cause the
processor interrupt level to be raised to wantipl if
necessary.
The
mtx_enter
()
function acquires a mutex, spinning if necessary.
The
mtx_enter_try
()
function attempts to acquire a mutex. If it succeeds in acquiring the mutex
it will return non-zero, otherwise it will return 0.
The
mtx_leave
()
function releases a mutex. In case the acquisition of the mutex caused the
interrupt level to be changed, it is then restored.
The
MUTEX_ASSERT_LOCKED
()
and
MUTEX_ASSERT_UNLOCKED
()
macros may be used to assert that a mutex is held locked or unlocked by the
current CPU.
SEE ALSO
HISTORY
The mutex
functions first appeared in
OpenBSD 3.6.
AUTHORS
The mutex
functions were written by
Artur Grabowski
<art@openbsd.org>.
CAVEATS
As these are spinning locks, don't sleep while holding one.
If using a mutex in an interrupt handler, locks must be initialised with the correct IPL or deadlock will occur.
Multiple mutexes may be nested, but not interleaved. This is okay:
mtx_enter(foo); mtx_enter(bar); mtx_leave(bar); mtx_leave(foo);
While this is not:
mtx_enter(foo); mtx_enter(bar); mtx_leave(foo); mtx_leave(bar);