OpenBSD manual page server

Manual Page Search Parameters

MUTEX(9) Kernel Developer's Manual MUTEX(9)

mutex, mtx_init, mtx_enter, mtx_enter_try, mtx_leaveinterface to CPU mutexes

#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);

The mutex set of functions provides a non-recursive, interrupt-aware spinning mechanism to ensure mutual exclusion between different CPUs.

The () 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 () function acquires a mutex, spinning if necessary.

The () function attempts to acquire a mutex. If it succeeds in acquiring the mutex it will return non-zero, otherwise it will return 0.

The () function releases a mutex. In case the acquisition of the mutex caused the interrupt level to be changed, it is then restored.

The () and () macros may be used to assert that a mutex is held locked or unlocked by the current CPU.

lockmgr(9), rwlock(9), spl(9)

The mutex functions first appeared in OpenBSD 3.6.

The mutex functions were written by Artur Grabowski <art@openbsd.org>.

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);
July 17, 2013 OpenBSD-5.4