[PATCH libevdev] Document that the fd should be drained before libevdev_set_fd
Benjamin Tissoires
benjamin.tissoires at gmail.com
Wed Dec 16 02:42:07 PST 2015
On Wed, Dec 16, 2015 at 1:39 AM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> This is the caller's responsibility, for two reasons:
> * we don't know if O_NONBLOCK is set, so draining the fd isn't a simple matter
> of read() until EAGAIN. A select() + read() could work around this of
> course.
> * for stateless information, keys and relative data, it is not a problem when
> there are events waiting on the fd already, they are processed correctly,
> albeit with a delay.
>
> So punt this decision to the caller, they openend the fd, they know if they
> care about delayed events, they can drain the fd before handing it to us.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
Works for me:
Acked-by: Benjamin Tissoires <benjamin.tissoires at gmail.com>
Cheers,
Benjamin
> libevdev/libevdev.h | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libevdev/libevdev.h b/libevdev/libevdev.h
> index eae8e7b..27e36d8 100644
> --- a/libevdev/libevdev.h
> +++ b/libevdev/libevdev.h
> @@ -78,7 +78,8 @@ extern "C" {
> *
> * libevdev does not handle the file descriptors directly, it merely uses
> * them. The caller is responsible for opening the file descriptors, setting
> - * them to O_NONBLOCK and handling permissions.
> + * them to O_NONBLOCK and handling permissions. A caller should drain any
> + * events pending on the file descriptor before passing it to libevdev.
> *
> * Where does libevdev sit?
> * ========================
> @@ -974,6 +975,15 @@ int libevdev_grab(struct libevdev *dev, enum libevdev_grab_mode grab);
> * you need to change the fd after closing and re-opening the same device, use
> * libevdev_change_fd().
> *
> + * A caller should ensure that any events currently pending on the fd are
> + * drained before the file descriptor is passed to libevdev for
> + * initialization. Due to how the kernel's ioctl handling works, the initial
> + * device state will reflect the current device state *after* applying all
> + * events currently pending on the fd. Thus, if the fd is not drained, the
> + * state visible to the caller will be inconsistent with the events
> + * immediately available on the device. This does not affect state-less
> + * events like EV_REL.
> + *
> * Unless otherwise specified, libevdev function behavior is undefined until
> * a successfull call to libevdev_set_fd().
> *
> --
> 2.5.0
>
> _______________________________________________
> Input-tools mailing list
> Input-tools at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/input-tools
More information about the Input-tools
mailing list