diff options
Diffstat (limited to 'kern/sleepq.c')
-rw-r--r-- | kern/sleepq.c | 24 |
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); |