From f306edb5ecc2edc0f2aa9abf8a97d57099df78e6 Mon Sep 17 00:00:00 2001 From: 8infy <99danilt@gmail.com> Date: Sun, 1 Sep 2024 19:41:10 +0300 Subject: [PATCH] semaphore: introduce a semaphore_reset helper This simply clears the internal counter of a semaphore. --- kernel-src/include/semaphore.h | 1 + kernel-src/lib/semaphore.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/kernel-src/include/semaphore.h b/kernel-src/include/semaphore.h index 00d1bedd..3d235fcd 100644 --- a/kernel-src/include/semaphore.h +++ b/kernel-src/include/semaphore.h @@ -27,6 +27,7 @@ typedef struct semaphore_t{ int semaphore_wait(semaphore_t *sem, bool interruptible); int semaphore_timedwait(semaphore_t *sem, time_t timeoutusec, bool interruptible); void semaphore_signal(semaphore_t *sem); +void semaphore_reset(semaphore_t *sem); bool semaphore_test(semaphore_t *sem); bool semaphore_haswaiters(semaphore_t *sem); diff --git a/kernel-src/lib/semaphore.c b/kernel-src/lib/semaphore.c index 872e336b..ac8e39c7 100644 --- a/kernel-src/lib/semaphore.c +++ b/kernel-src/lib/semaphore.c @@ -125,6 +125,13 @@ void semaphore_signal(semaphore_t *sem) { interrupt_set(intstate); } +void semaphore_reset(semaphore_t *sem) { + bool intstate = spinlock_acquireirqclear(&sem->lock); + __assert(sem->head == NULL); + sem->i = 0; + spinlock_releaseirqrestore(&sem->lock, intstate); +} + bool semaphore_haswaiters(semaphore_t *sem) { bool intstate = interrupt_set(false); spinlock_acquire(&sem->lock);