aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/include/wait.h
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-01-17 14:41:12 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-01-17 14:41:12 +0000
commite2edfe6c73a287989911630a070c3e6c1137446f (patch)
treeb044338ff520ea64997a9487de9f672e55efcf97 /extras/mini-os/include/wait.h
parent69ca1c28b492eab7bc28491cd5f6b7c4e8fdcb34 (diff)
downloadxen-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.h44
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)