[PATCH libevdev 1/3] Count the number of events needed for a full sync

David Herrmann dh.herrmann at gmail.com
Fri Jan 17 04:15:02 PST 2014


Hi

On Fri, Jan 17, 2014 at 4:31 AM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> Make sure we have a queue that is at least large enough to do a full sync
> after a SYN_DROPPED, plus store a few extra events in case some came in after
> the sync.

EVIOCGKEY() and friends flush the input queue, so there's no need to
account for extra events. Obviously, we don't flush EV_REL or EV_ABS,
as they don't suffer from synchronization-issues. So only these need
extra space.

On the other hand, there might be incoming events between our
sync-ioctl()s, so we can never be sure there're no new events.. So
maybe I should just shut up..

>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  libevdev/libevdev.c | 34 ++++++++++++++++++++++++++++++----
>  1 file changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
> index 8a37204..59625a4 100644
> --- a/libevdev/libevdev.c
> +++ b/libevdev/libevdev.c
> @@ -41,12 +41,38 @@ static int sync_mt_state(struct libevdev *dev, int create_events);
>  static int
>  init_event_queue(struct libevdev *dev)
>  {
> -       /* FIXME: count the number of axes, keys, etc. to get a better idea at how many events per
> -          EV_SYN we could possibly get. Then multiply that by the actual buffer size we care about */
> +       const int MIN_QUEUE_SIZE = 256;
> +       int nevents = 1; /* terminating SYN_REPORT */

You do "nevents * 2" below, but you account for a single report here?
Seems overkill, but ok, doesn't hurt.

> +       int nslots;
> +       unsigned int type, code;
>
> -       const int QUEUE_SIZE = 256;
> +       /* count the number of axes, keys, etc. to get a better idea at how
> +          many events per EV_SYN we could possibly get. That's the max we
> +          may get during SYN_DROPPED too. Use double that, just so we have
> +          room for events while syncing an event.
> +        */
> +       for (type = EV_KEY; type < EV_MAX; type++) {
> +               int max = libevdev_event_type_get_max(type);
> +               for (code = 0; max > 0 && code < (unsigned int) max; code++) {
> +                       if (libevdev_has_event_code(dev, type, code))
> +                               nevents++;
> +               }
> +       }
>
> -       return queue_alloc(dev, QUEUE_SIZE);
> +       nslots = libevdev_get_num_slots(dev);
> +       if (nslots > 1) {
> +               int num_mt_axes = 0;
> +
> +               for (code = ABS_MT_SLOT; code < ABS_MAX; code++) {
> +                       if (libevdev_has_event_code(dev, EV_ABS, code))
> +                               num_mt_axes++;
> +               }
> +
> +               /* We already counted the first slot in the initial count */
> +               nevents += num_mt_axes * (nslots - 1);

Again a bit overkill to drop that one axis, but ok. Patch looks good to me:
Reviewed-by: David Herrmann <dh.herrmann at gmail.com>

Thanks
David

> +       }
> +
> +       return queue_alloc(dev, min(MIN_QUEUE_SIZE, nevents * 2));
>  }
>
>  static void
> --
> 1.8.4.2
>
> _______________________________________________
> 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