From 50c583b698c4d1d13d1c0537c350691b18dd7033 Mon Sep 17 00:00:00 2001 From: Richard Braun Date: Sun, 27 Aug 2017 16:55:36 +0200 Subject: kern/semaphore: implement timed waits --- kern/semaphore.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'kern/semaphore.c') diff --git a/kern/semaphore.c b/kern/semaphore.c index 7e94dafd..72e843a9 100644 --- a/kern/semaphore.c +++ b/kern/semaphore.c @@ -15,19 +15,25 @@ * along with this program. If not, see . */ +#include #include #include +#include #include #include #include -void -semaphore_wait_slow(struct semaphore *semaphore) +static int +semaphore_wait_slow_common(struct semaphore *semaphore, + bool timed, uint64_t ticks) { struct sleepq *sleepq; unsigned long flags; unsigned int prev; + int error; + + error = 0; sleepq = sleepq_lend(semaphore, false, &flags); @@ -38,10 +44,35 @@ semaphore_wait_slow(struct semaphore *semaphore) break; } - sleepq_wait(sleepq, "sem"); + if (!timed) { + sleepq_wait(sleepq, "sem"); + } else { + error = sleepq_timedwait(sleepq, "sem", ticks); + + if (error) { + break; + } + } } sleepq_return(sleepq, flags); + + return error; +} + +void +semaphore_wait_slow(struct semaphore *semaphore) +{ + int error; + + error = semaphore_wait_slow_common(semaphore, false, 0); + assert(!error); +} + +int +semaphore_timedwait_slow(struct semaphore *semaphore, uint64_t ticks) +{ + return semaphore_wait_slow_common(semaphore, true, ticks); } void -- cgit v1.2.3