summaryrefslogtreecommitdiff
path: root/include/linux/wait.h
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-06-23 18:54:26 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-06-23 18:54:26 -0700
commit758e48e4186f474b3258b9c4b4480511df1e6808 (patch)
tree19eb965b87b72397cc0b1b60ccf75d8abe7703e3 /include/linux/wait.h
parent0ac04ac1d635bc16d7336171c01899bf97b04953 (diff)
[PATCH] Use fancy wakeups in wait.h
Use the more SMP-friendly prepare_to_wait()/finish_wait() in wait_event() and friends. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux/wait.h')
-rw-r--r--include/linux/wait.h37
1 files changed, 13 insertions, 24 deletions
diff --git a/include/linux/wait.h b/include/linux/wait.h
index 4a9f996bb6cc..e0f2b2ffc16f 100644
--- a/include/linux/wait.h
+++ b/include/linux/wait.h
@@ -120,18 +120,15 @@ extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int
#define __wait_event(wq, condition) \
do { \
- wait_queue_t __wait; \
- init_waitqueue_entry(&__wait, current); \
+ DEFINE_WAIT(__wait); \
\
- add_wait_queue(&wq, &__wait); \
for (;;) { \
- set_current_state(TASK_UNINTERRUPTIBLE); \
+ prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \
if (condition) \
break; \
schedule(); \
} \
- current->state = TASK_RUNNING; \
- remove_wait_queue(&wq, &__wait); \
+ finish_wait(&wq, &__wait); \
} while (0)
#define wait_event(wq, condition) \
@@ -143,12 +140,10 @@ do { \
#define __wait_event_interruptible(wq, condition, ret) \
do { \
- wait_queue_t __wait; \
- init_waitqueue_entry(&__wait, current); \
+ DEFINE_WAIT(__wait); \
\
- add_wait_queue(&wq, &__wait); \
for (;;) { \
- set_current_state(TASK_INTERRUPTIBLE); \
+ prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \
if (condition) \
break; \
if (!signal_pending(current)) { \
@@ -158,8 +153,7 @@ do { \
ret = -ERESTARTSYS; \
break; \
} \
- current->state = TASK_RUNNING; \
- remove_wait_queue(&wq, &__wait); \
+ finish_wait(&wq, &__wait); \
} while (0)
#define wait_event_interruptible(wq, condition) \
@@ -172,12 +166,10 @@ do { \
#define __wait_event_interruptible_timeout(wq, condition, ret) \
do { \
- wait_queue_t __wait; \
- init_waitqueue_entry(&__wait, current); \
+ DEFINE_WAIT(__wait); \
\
- add_wait_queue(&wq, &__wait); \
for (;;) { \
- set_current_state(TASK_INTERRUPTIBLE); \
+ prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \
if (condition) \
break; \
if (!signal_pending(current)) { \
@@ -189,8 +181,7 @@ do { \
ret = -ERESTARTSYS; \
break; \
} \
- current->state = TASK_RUNNING; \
- remove_wait_queue(&wq, &__wait); \
+ finish_wait(&wq, &__wait); \
} while (0)
#define wait_event_interruptible_timeout(wq, condition, timeout) \
@@ -203,12 +194,11 @@ do { \
#define __wait_event_interruptible_exclusive(wq, condition, ret) \
do { \
- wait_queue_t __wait; \
- init_waitqueue_entry(&__wait, current); \
+ DEFINE_WAIT(__wait); \
\
- add_wait_queue_exclusive(&wq, &__wait); \
for (;;) { \
- set_current_state(TASK_INTERRUPTIBLE); \
+ prepare_to_wait_exclusive(&wq, &__wait, \
+ TASK_INTERRUPTIBLE); \
if (condition) \
break; \
if (!signal_pending(current)) { \
@@ -218,8 +208,7 @@ do { \
ret = -ERESTARTSYS; \
break; \
} \
- current->state = TASK_RUNNING; \
- remove_wait_queue(&wq, &__wait); \
+ finish_wait(&wq, &__wait); \
} while (0)
#define wait_event_interruptible_exclusive(wq, condition) \