Placing yourself in the waitqueue is fairly complex, because you
must put yourself in the queue before checking the condition.
There is a macro to do this:
wait_event_interruptible()
include/linux/wait.h
The
first argument is the wait queue head, and the second is an
expression which is evaluated; the macro returns
0 when this expression is true, or
-ERESTARTSYS if a signal is received.
The wait_event()
version ignores signals.
Do not use the sleep_on()
function family -
it is very easy to accidentally introduce races; almost certainly
one of the wait_event()
family will do, or a
loop around schedule_timeout()
. If you choose
to loop around schedule_timeout()
remember
you must set the task state (with
set_current_state()
) on each iteration to avoid
busy-looping.