diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-01-17 14:41:12 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-01-17 14:41:12 +0000 |
commit | e2edfe6c73a287989911630a070c3e6c1137446f (patch) | |
tree | b044338ff520ea64997a9487de9f672e55efcf97 /extras/mini-os/include/wait.h | |
parent | 69ca1c28b492eab7bc28491cd5f6b7c4e8fdcb34 (diff) | |
download | xen-e2edfe6c73a287989911630a070c3e6c1137446f.tar.gz xen-e2edfe6c73a287989911630a070c3e6c1137446f.tar.bz2 xen-e2edfe6c73a287989911630a070c3e6c1137446f.zip |
minios: add wait_event_deadline
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Signed-off-by: Tim Deegan <tim.deegan@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/include/wait.h')
-rw-r--r-- | extras/mini-os/include/wait.h | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/extras/mini-os/include/wait.h b/extras/mini-os/include/wait.h index 6bd4d0ce95..cbcaab3519 100644 --- a/extras/mini-os/include/wait.h +++ b/extras/mini-os/include/wait.h @@ -85,29 +85,31 @@ static inline void wake_up(struct wait_queue_head *head) local_irq_restore(flags); \ } while (0) -#define wait_event(wq, condition) do{ \ - unsigned long flags; \ - if(condition) \ - break; \ - DEFINE_WAIT(__wait); \ - for(;;) \ - { \ - /* protect the list */ \ - local_irq_save(flags); \ - add_wait_queue(&wq, &__wait); \ - block(current); \ - local_irq_restore(flags); \ - if(condition) \ - break; \ - schedule(); \ - } \ - local_irq_save(flags); \ - /* need to wake up */ \ - wake(current); \ - remove_wait_queue(&__wait); \ - local_irq_restore(flags); \ +#define wait_event_deadline(wq, condition, deadline) do { \ + unsigned long flags; \ + if(condition) \ + break; \ + DEFINE_WAIT(__wait); \ + for(;;) \ + { \ + /* protect the list */ \ + local_irq_save(flags); \ + add_wait_queue(&wq, &__wait); \ + current->wakeup_time = deadline; \ + clear_runnable(current); \ + local_irq_restore(flags); \ + if((condition) || (deadline && NOW() >= deadline)) \ + break; \ + schedule(); \ + } \ + local_irq_save(flags); \ + /* need to wake up */ \ + wake(current); \ + remove_wait_queue(&__wait); \ + local_irq_restore(flags); \ } while(0) +#define wait_event(wq, condition) wait_event_deadline(wq, condition, 0) |