From 7e3922c7ade21232f22d6aa04591078774e17fbd Mon Sep 17 00:00:00 2001 From: 8infy <99danilt@gmail.com> Date: Sun, 1 Sep 2024 19:39:25 +0300 Subject: [PATCH] semaphore: add a new semaphore_timedwait helper This is the same as semaphore_wait except it allows for the acquire attempt to time out after a given period of time. --- kernel-src/include/semaphore.h | 2 ++ kernel-src/lib/semaphore.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/kernel-src/include/semaphore.h b/kernel-src/include/semaphore.h index 9f2d650e..00d1bedd 100644 --- a/kernel-src/include/semaphore.h +++ b/kernel-src/include/semaphore.h @@ -4,6 +4,7 @@ #include #include #include +#include #define SEM_TAIL 0 #define SEM_HEAD 1 @@ -24,6 +25,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); 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 ba0038d8..872e336b 100644 --- a/kernel-src/lib/semaphore.c +++ b/kernel-src/lib/semaphore.c @@ -88,6 +88,23 @@ int semaphore_wait(semaphore_t *sem, bool interruptible) { return ret; } +int semaphore_timedwait(semaphore_t *sem, time_t timeoutusec, bool interruptible) { + time_t sleepus; + + do { + if (semaphore_test(sem)) + return true; + + sleepus = min(timeoutusec, 10); + timeoutusec -= sleepus; + + if (sleepus) + sched_sleepus(sleepus); + } while (timeoutusec); + + return false; +} + void semaphore_signal(semaphore_t *sem) { bool intstate = interrupt_set(false); spinlock_acquire(&sem->lock);