[PATCH libinput] test: add an extra loop for slow udev initialization

Hans de Goede hdegoede at redhat.com
Tue May 26 07:02:56 PDT 2015


Hi,

On 05/26/2015 04:56 AM, Peter Hutterer wrote:
> On slower machines, e.g. VMs, udev isn't fast enough to get the properties set
> up by the time we're trying to get the device going. This fails when we try to
> add the device with libinput_path_add_device().
>
> We know that all litest devices will have ID_INPUT set, so check for that
> before we continue.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> If anyone has any better ideas here, I'm all ears.

I'm afraid I don't have any better idea for this either:

LGTM: Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans

>
>   test/litest.c | 28 ++++++++++++++++++++++++++++
>   1 file changed, 28 insertions(+)
>
> diff --git a/test/litest.c b/test/litest.c
> index fbbdaeb..d9cf452 100644
> --- a/test/litest.c
> +++ b/test/litest.c
> @@ -985,6 +985,32 @@ litest_restore_log_handler(struct libinput *libinput)
>   	libinput_log_set_handler(libinput, litest_log_handler);
>   }
>
> +static inline void
> +litest_wait_for_udev(int fd)
> +{
> +	struct udev *udev;
> +	struct udev_device *device;
> +	struct stat st;
> +	int loop_count = 0;
> +
> +	litest_assert_int_ge(fstat(fd, &st), 0);
> +
> +	udev = udev_new();
> +	device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
> +	litest_assert_ptr_notnull(device);
> +	while (device && !udev_device_get_property_value(device, "ID_INPUT")) {
> +		loop_count++;
> +		litest_assert_int_lt(loop_count, 300);
> +
> +		udev_device_unref(device);
> +		msleep(2);
> +		device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
> +	}
> +
> +	udev_device_unref(device);
> +	udev_unref(udev);
> +}
> +
>   struct litest_device *
>   litest_add_device_with_overrides(struct libinput *libinput,
>   				 enum litest_device_type which,
> @@ -1012,6 +1038,8 @@ litest_add_device_with_overrides(struct libinput *libinput,
>   	rc = libevdev_new_from_fd(fd, &d->evdev);
>   	litest_assert_int_eq(rc, 0);
>
> +	litest_wait_for_udev(fd);
> +
>   	d->libinput = libinput;
>   	d->libinput_device = libinput_path_add_device(d->libinput, path);
>   	litest_assert(d->libinput_device != NULL);
>


More information about the wayland-devel mailing list