include/sync/mutex_simple.h View source View on GitHub
struct mutex_simple {
struct thread *owner;
struct thread_queue waiters;
struct spinlock lock;
};
void mutex_simple_init_chk_internal(struct mutex_simple *m, const struct lock_chk_class *class, enum lock_chk_flags flags);
void mutex_simple_set_chk_flags(struct mutex_simple *m, enum lock_chk_flags flags);
void mutex_simple_reinit_chk(struct mutex_simple *m, const struct lock_chk_class *class, enum lock_chk_flags flags);
void mutex_simple_lock_internal(struct mutex_simple *m, const struct lock_chk_site *site);
void mutex_simple_unlock_internal(struct mutex_simple *m, const struct lock_chk_site *site);
void mutex_simple_lock_subclass_internal(struct mutex_simple *m, uint8_t subclass, const struct lock_chk_site *site);
bool mutex_simple_locked(struct mutex_simple *m);
struct thread * mutex_simple_get_owner(struct mutex_simple *m);
void mutex_simple_assert_held_internal(struct mutex_simple *m, const struct lock_chk_site *site);
void mutex_simple_assert_not_held_internal(struct mutex_simple *m, const struct lock_chk_site *site);
#define MUTEX_SIMPLE_INIT_CHK(id_, class_, flags_) \
((struct mutex_simple) { \
.owner = NULL, \
.waiters = \
{ \
.list = LIST_HEAD_INIT((id_).waiters.list), \
.lock = SPINLOCK_INIT_CHK(NULL, LOCK_UNCHKD), \
}, \
.lock = SPINLOCK_INIT_CHK(NULL, LOCK_UNCHKD), \
.chk = LOCK_CHK_LOCK_VALUE_INIT((class_), (flags_)), \
})
#define mutex_simple_init_chk(mtx_, class_, flags_) \
mutex_simple_init_chk_internal((mtx_), (class_), (flags_))
#define mutex_simple_init_auto_internal(mtx_, flags_) \
do { \
static const struct lock_chk_class __auto_class = { \
.name = #mtx_, \
.file = __RELFILE__, \
.line = __LINE__, \
}; \
mutex_simple_init_chk_internal((mtx_), &__auto_class, (flags_)); \
} while (0)
#define MUTEX_SIMPLE_INIT_CHK(id_, class_, flags_) \
((struct mutex_simple) { \
.owner = NULL, \
.waiters = \
{ \
.list = LIST_HEAD_INIT((id_).waiters.list), \
.lock = SPINLOCK_INIT_CHK(NULL, LOCK_UNCHKD), \
}, \
.lock = SPINLOCK_INIT_CHK(NULL, LOCK_UNCHKD), \
})
#define mutex_simple_init_chk(mtx_, class_, flags_) \
mutex_simple_init_chk_internal((mtx_), NULL, LOCK_UNCHKD)
#define mutex_simple_init_auto_internal(mtx_, flags_) \
mutex_simple_init_chk_internal((mtx_), NULL, LOCK_UNCHKD)
#define MUTEX_SIMPLE_INIT(id_) \
MUTEX_SIMPLE_INIT_CHK((id_), NULL, LOCK_CHKD_FULL)
#define MUTEX_SIMPLE_DEFINE(id) struct mutex_simple id = MUTEX_SIMPLE_INIT(id)
#define MUTEX_SIMPLE_DEFINE_CHK(id, class_, flags_) \
struct mutex_simple id = MUTEX_SIMPLE_INIT_CHK((id), (class_), (flags_))
#define mutex_simple_init_1(mtx_) \
mutex_simple_init_auto_internal((mtx_), LOCK_CHKD_FULL)
#define mutex_simple_init_2(mtx_, flags_) \
mutex_simple_init_auto_internal((mtx_), (flags_))
#define mutex_simple_init(...) \
_DISPATCH(mutex_simple_init, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
#define mutex_simple_lock(m_) \
mutex_simple_lock_internal((m_), LOCK_CHK_SITE_HERE())
#define mutex_simple_unlock(m_) \
mutex_simple_unlock_internal((m_), LOCK_CHK_SITE_HERE())
#define mutex_simple_lock_subclass(m_, subclass_) \
mutex_simple_lock_subclass_internal((m_), (subclass_), LOCK_CHK_SITE_HERE())
#define MUTEX_SIMPLE_ASSERT_HELD(m) \
mutex_simple_assert_held_internal((m), LOCK_CHK_SITE_HERE())
#define MUTEX_SIMPLE_ASSERT_NOT_HELD(m) \
mutex_simple_assert_not_held_internal((m), LOCK_CHK_SITE_HERE())