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