Add wait_event_killable
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
This commit is contained in:
committed by
Matthew Wilcox
parent
294d5cc233
commit
1411d5a7fb
@@ -346,6 +346,47 @@ do { \
|
|||||||
__ret; \
|
__ret; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define __wait_event_killable(wq, condition, ret) \
|
||||||
|
do { \
|
||||||
|
DEFINE_WAIT(__wait); \
|
||||||
|
\
|
||||||
|
for (;;) { \
|
||||||
|
prepare_to_wait(&wq, &__wait, TASK_KILLABLE); \
|
||||||
|
if (condition) \
|
||||||
|
break; \
|
||||||
|
if (!fatal_signal_pending(current)) { \
|
||||||
|
schedule(); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
ret = -ERESTARTSYS; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
finish_wait(&wq, &__wait); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wait_event_killable - sleep until a condition gets true
|
||||||
|
* @wq: the waitqueue to wait on
|
||||||
|
* @condition: a C expression for the event to wait for
|
||||||
|
*
|
||||||
|
* The process is put to sleep (TASK_KILLABLE) until the
|
||||||
|
* @condition evaluates to true or a signal is received.
|
||||||
|
* The @condition is checked each time the waitqueue @wq is woken up.
|
||||||
|
*
|
||||||
|
* wake_up() has to be called after changing any variable that could
|
||||||
|
* change the result of the wait condition.
|
||||||
|
*
|
||||||
|
* The function will return -ERESTARTSYS if it was interrupted by a
|
||||||
|
* signal and 0 if @condition evaluated to true.
|
||||||
|
*/
|
||||||
|
#define wait_event_killable(wq, condition) \
|
||||||
|
({ \
|
||||||
|
int __ret = 0; \
|
||||||
|
if (!(condition)) \
|
||||||
|
__wait_event_killable(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.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user