summaryrefslogtreecommitdiff
path: root/kern/sleepq.c
diff options
context:
space:
mode:
Diffstat (limited to 'kern/sleepq.c')
-rw-r--r--kern/sleepq.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/kern/sleepq.c b/kern/sleepq.c
index 3a9273be..294ad7ca 100644
--- a/kern/sleepq.c
+++ b/kern/sleepq.c
@@ -450,17 +450,23 @@ sleepq_wait_common(struct sleepq *sleepq, const char *wchan,
sleepq_waiter_init(&waiter, thread);
sleepq_add_waiter(sleepq, &waiter);
- if (!timed) {
- thread_sleep(&sleepq->bucket->lock, sleepq->sync_obj, wchan);
- error = 0;
- } else {
- error = thread_timedsleep(&sleepq->bucket->lock, sleepq->sync_obj,
- wchan, ticks);
-
- if (error && sleepq_waiter_pending_wakeup(&waiter)) {
+ do {
+ if (!timed) {
+ thread_sleep(&sleepq->bucket->lock, sleepq->sync_obj, wchan);
error = 0;
+ } else {
+ error = thread_timedsleep(&sleepq->bucket->lock, sleepq->sync_obj,
+ wchan, ticks);
+
+ if (error) {
+ if (sleepq_waiter_pending_wakeup(&waiter)) {
+ error = 0;
+ } else {
+ break;
+ }
+ }
}
- }
+ } while (!sleepq_waiter_pending_wakeup(&waiter));
sleepq_remove_waiter(sleepq, &waiter);