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