Mutex
include/sync/mutex.h View source View on GitHubmutex: pointer sized mutex
┌─────────────────────────┐Bits │ .... .... .... 3..0 │Use │ %%%% %%%% %%%% %rrh │ └─────────────────────────┘h - “held” - is the lock held?
r - reserved for future use
%%%% - pointer to owner thread
Functions
Section titled “Functions”mutex_init_chk_full
Section titled “mutex_init_chk_full”void mutex_init_chk_full(
struct mutex *mtx,
const struct lock_chk_class *class,
enum lock_chk_flags flags
) source mutex_set_chk_flags
Section titled “mutex_set_chk_flags”void mutex_set_chk_flags(struct mutex *mtx, enum lock_chk_flags flags) source mutex_reinit_chk
Section titled “mutex_reinit_chk”void mutex_reinit_chk(
struct mutex *mtx,
const struct lock_chk_class *class,
enum lock_chk_flags flags
) source mutex_locked
Section titled “mutex_locked”mutex_read_owner
Section titled “mutex_read_owner”mutex_assert_not_held_full
Section titled “mutex_assert_not_held_full”void mutex_assert_not_held_full(
struct mutex *mtx,
const struct lock_chk_site *site
) source mutex_guard_exit
Section titled “mutex_guard_exit”mutex_guard_assume
Section titled “mutex_guard_assume”mutex_guard_enter
Section titled “mutex_guard_enter”mutex_guard_subclass_enter
Section titled “mutex_guard_subclass_enter”struct mutex * mutex_guard_subclass_enter(
struct mutex *m,
enum lock_subclass subclass
) source Variables
Section titled “Variables”lock_word
Section titled “lock_word”atomic_uintptr_t lock_word source struct lock_chk_lock chk source Macros
Section titled “Macros”MUTEX_INIT_CHK
Section titled “MUTEX_INIT_CHK”#define MUTEX_INIT_CHK(class_, flags_) source Expansion
#define MUTEX_INIT_CHK(class_, flags_) \
((struct mutex) { \
.lock_word = ATOMIC_VAR_INIT(0), \
.chk = LOCK_CHK_LOCK_VALUE_INIT((class_), (flags_)), \
}) mutex_init_chk
Section titled “mutex_init_chk”#define mutex_init_chk(mtx_, class_, flags_) source Expansion
#define mutex_init_chk(mtx_, class_, flags_) \
mutex_init_chk_full((mtx_), (class_), (flags_)) mutex_init_auto_internal
Section titled “mutex_init_auto_internal”#define mutex_init_auto_internal(mtx_, flags_) source Expansion
#define mutex_init_auto_internal(mtx_, flags_) \
do { \
static const struct lock_chk_class __auto_class = { \
.name = #mtx_, \
.file = __RELFILE__, \
.line = __LINE__, \
}; \
mutex_init_chk_full((mtx_), &__auto_class, (flags_)); \
} while (0) MUTEX_INIT_CHK
Section titled “MUTEX_INIT_CHK”#define MUTEX_INIT_CHK(class_, flags_) source Expansion
#define MUTEX_INIT_CHK(class_, flags_) \
((struct mutex) {.lock_word = ATOMIC_VAR_INIT(0)}) mutex_init_chk
Section titled “mutex_init_chk”#define mutex_init_chk(mtx_, class_, flags_) source Expansion
#define mutex_init_chk(mtx_, class_, flags_) \
mutex_init_chk_full((mtx_), NULL, LOCK_UNCHKD) mutex_init_auto_internal
Section titled “mutex_init_auto_internal”#define mutex_init_auto_internal(mtx_, flags_) source Expansion
#define mutex_init_auto_internal(mtx_, flags_) \
mutex_init_chk_full((mtx_), NULL, LOCK_UNCHKD) MUTEX_INIT
Section titled “MUTEX_INIT”#define MUTEX_INIT MUTEX_INIT_CHK(NULL, LOCK_CHKD_FULL) source MUTEX_DEFINE
Section titled “MUTEX_DEFINE”#define MUTEX_DEFINE(id) source Expansion
#define MUTEX_DEFINE(id) struct mutex id = MUTEX_INIT MUTEX_DEFINE_CHK
Section titled “MUTEX_DEFINE_CHK”#define MUTEX_DEFINE_CHK(id, class_, flags_) source Expansion
#define MUTEX_DEFINE_CHK(id, class_, flags_) \
struct mutex id = MUTEX_INIT_CHK((class_), (flags_)) mutex_init_1
Section titled “mutex_init_1”#define mutex_init_1(mtx_) source Expansion
#define mutex_init_1(mtx_) mutex_init_2(mtx_, LOCK_CHKD_FULL) mutex_init_2
Section titled “mutex_init_2”#define mutex_init_2(mtx_, flags_) source Expansion
#define mutex_init_2(mtx_, flags_) mutex_init_auto_internal((mtx_), (flags_)) mutex_init
Section titled “mutex_init”#define mutex_init(...) source Expansion
#define mutex_init(...) PP_CALL(mutex_init, __VA_ARGS__) mutex_lock
Section titled “mutex_lock”#define mutex_lock(mutex_) source Expansion
#define mutex_lock(mutex_) mutex_lock_full((mutex_), LOCK_CHK_SITE_HERE()) mutex_lock_subclass
Section titled “mutex_lock_subclass”#define mutex_lock_subclass(mutex_, subclass_) source Expansion
#define mutex_lock_subclass(mutex_, subclass_) \
mutex_lock_subclass_full((mutex_), (subclass_), LOCK_CHK_SITE_HERE()) mutex_unlock
Section titled “mutex_unlock”#define mutex_unlock(mutex_) source Expansion
#define mutex_unlock(mutex_) mutex_unlock_full((mutex_), LOCK_CHK_SITE_HERE()) MUTEX_ASSERT_HELD
Section titled “MUTEX_ASSERT_HELD”#define MUTEX_ASSERT_HELD(m) source Expansion
#define MUTEX_ASSERT_HELD(m) mutex_assert_held_full((m), LOCK_CHK_SITE_HERE()) MUTEX_ASSERT_NOT_HELD
Section titled “MUTEX_ASSERT_NOT_HELD”#define MUTEX_ASSERT_NOT_HELD(m) source Expansion
#define MUTEX_ASSERT_NOT_HELD(m) \
mutex_assert_not_held_full((m), LOCK_CHK_SITE_HERE()) mutex_guard
Section titled “mutex_guard”#define mutex_guard(m_) source Expansion
#define mutex_guard(m_) \
cc_cleanup(mutex_guard_exit) struct mutex *PP_CONCAT(mtx_guard_, \
__COUNTER__) = \
(mutex_guard_assume(m_), mutex_guard_enter(m_)) mutex_guard_subclass
Section titled “mutex_guard_subclass”#define mutex_guard_subclass(m_, subclass_) source Expansion
#define mutex_guard_subclass(m_, subclass_) \
cc_cleanup(mutex_guard_exit) struct mutex *PP_CONCAT(mtx_guard_, \
__COUNTER__) = \
(mutex_guard_assume(m_), \
mutex_guard_subclass_enter((m_), (subclass_)))