From 92787ddd751d05c5e961631e9676cac95136f6f0 Mon Sep 17 00:00:00 2001 From: Marvin Friedrich Date: Fri, 23 Oct 2026 00:35:11 +0200 Subject: [PATCH] Add initializers --- include/zinnia/mutex.h | 2 ++ include/zinnia/rwlock.h | 2 ++ lib/mutex.c | 4 ++++ lib/rwlock.c | 4 ++++ 4 files changed, 12 insertions(+) diff --git a/include/zinnia/mutex.h b/include/zinnia/mutex.h index cd66f80..b460e0d 100644 --- a/include/zinnia/mutex.h +++ b/include/zinnia/mutex.h @@ -6,6 +6,8 @@ typedef _Atomic(uintptr_t) mutex_t; +void mutex_init(mutex_t* mutex); + void mutex_lock(mutex_t* mutex); bool mutex_trylock(mutex_t* mutex); diff --git a/include/zinnia/rwlock.h b/include/zinnia/rwlock.h index 8287782..85ed512 100644 --- a/include/zinnia/rwlock.h +++ b/include/zinnia/rwlock.h @@ -8,6 +8,8 @@ struct rwlock { atomic_uintptr_t word; }; +void rwlock_init(struct rwlock* rw); + void rwlock_read_lock(struct rwlock* rw); void rwlock_read_unlock(struct rwlock* rw); bool rwlock_try_read_lock(struct rwlock* rw); diff --git a/lib/mutex.c b/lib/mutex.c index 6e37119..fed07ff 100644 --- a/lib/mutex.c +++ b/lib/mutex.c @@ -32,6 +32,10 @@ static inline bool owner_is_running(uintptr_t owner) { return atomic_load(&((struct task*)owner)->on_cpu, ATOMIC_RELAXED); } +void mutex_init(mutex_t* mutex) { + atomic_store(mutex, 0, ATOMIC_RELAXED); +} + bool mutex_trylock(mutex_t* mutex) { uintptr_t self = self_token(); uintptr_t word = atomic_load(mutex, ATOMIC_RELAXED); diff --git a/lib/rwlock.c b/lib/rwlock.c index b9c24aa..661dbdf 100644 --- a/lib/rwlock.c +++ b/lib/rwlock.c @@ -41,6 +41,10 @@ static inline uint8_t priority_of(struct task* task) { return atomic_load(&task->priority, ATOMIC_RELAXED); } +void rwlock_init(struct rwlock* rw) { + atomic_store(&rw->word, 0, ATOMIC_RELAXED); +} + bool rwlock_try_read_lock(struct rwlock* rw) { uintptr_t word = atomic_load(&rw->word, ATOMIC_RELAXED); while (!(word & (RW_WRITE_LOCK | RW_WRITE_WANT))) {