Commit a2816bbf authored by Dean Nelson's avatar Dean Nelson Committed by Linus Torvalds

[PATCH] add wait_event_interruptible_exclusive() macro

This patch defines a macro that does exactly what
wait_event_interruptible() does except that it adds the current task to the
wait queue as an exclusive task (i.e., sets the WQ_FLAG_EXCLUSIVE flag)
rather than as a non-exclusive task as wait_event_interruptible() does.

This allows one to do a wake_up_nr() to wake up a specific number of tasks.
 I'm in the process of submitting a patch to linux-ia64 that requires this
capability.  (Its subject line is "[PATCH 3/4] SGI Altix cross partition
functionality".)
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c87c2fe1
...@@ -201,6 +201,35 @@ do { \ ...@@ -201,6 +201,35 @@ do { \
__ret; \ __ret; \
}) })
#define __wait_event_interruptible_exclusive(wq, condition, ret) \
do { \
wait_queue_t __wait; \
init_waitqueue_entry(&__wait, current); \
\
add_wait_queue_exclusive(&wq, &__wait); \
for (;;) { \
set_current_state(TASK_INTERRUPTIBLE); \
if (condition) \
break; \
if (!signal_pending(current)) { \
schedule(); \
continue; \
} \
ret = -ERESTARTSYS; \
break; \
} \
current->state = TASK_RUNNING; \
remove_wait_queue(&wq, &__wait); \
} while (0)
#define wait_event_interruptible_exclusive(wq, condition) \
({ \
int __ret = 0; \
if (!(condition)) \
__wait_event_interruptible_exclusive(wq, condition, __ret);\
__ret; \
})
/* /*
* Must be called with the spinlock in the wait_queue_head_t held. * Must be called with the spinlock in the wait_queue_head_t held.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment