Re: [PATCH]: add a new wait_event_interruptible_timeout_modifyhelper

From: Linus Torvalds
Date: Fri Sep 26 2008 - 11:02:20 EST




On Thu, 25 Sep 2008, Anirban Sinha wrote:
> +
> +/**
> + * wait_event_interruptible_timeout_modify - sleep until a condition gets true or a timeout elapses.
> + * @wq: the waitqueue to wait on
> + * @condition: a C expression for the event to wait for
> + * @timeout: timeout, in jiffies
> + *
> + * The process is put to sleep (TASK_INTERRUPTIBLE) 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 returns 0 if the @timeout elapsed, -ERESTARTSYS if it
> + * was interrupted by a signal, and the remaining jiffies otherwise
> + * if the condition evaluated to true before the timeout elapsed.
> + * It also modifies the @timeout value so that if the sleep is interrupted
> + * by a signal, the caller can call this helper again with the updated
> + * timeout.

Grr.

I'd _much_ rather just have a

wait_event_interruptible_until(wr, condition, abs_timeout)

where the timeout is just given as an end value, and the user can just
pre-calculate it once and the return code handling is simpler (either
"success" or "EINTR").

Giving an absolute value also means that there is no rounding creep or
anything like that in a loop, which otherwise happens very easily (even
if we wouldn't normally really care).

And quite frankly, people can do that themselves even without a helper
function, with simply

unsigned long end = jiffies + timeout;
...

rc = wait_event_interruptible_timeout(wq, event, end - jiffies);
if (rc < 0)
goto out;

and now you always know the end-point, and 'end - jiffies' is always the
remaining timeout.

Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/