[PATCH 12/12] config-udev: Add delayed input device probing

Peter Hutterer peter.hutterer at who-t.net
Tue Jan 28 16:45:28 PST 2014


On Wed, Jan 15, 2014 at 03:32:26PM +0100, Hans de Goede wrote:
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  config/udev.c                                | 35 ++++++++++++++++++++++++++--
>  hw/xfree86/os-support/linux/systemd-logind.c |  4 ++++
>  include/hotplug.h                            |  4 ++++
>  3 files changed, 41 insertions(+), 2 deletions(-)
> 
> diff --git a/config/udev.c b/config/udev.c
> index 58bc3d9..3e5889e 100644
> --- a/config/udev.c
> +++ b/config/udev.c
> @@ -59,6 +59,8 @@ struct input_device_info {
>  };
>  
>  static struct udev_monitor *udev_monitor;
> +static struct input_device_info *new_input_devices;
> +static int new_input_devices_count;

make this a xorg_list please, rest looks ok.

Cheers,
   Peter


>  
>  #ifdef CONFIG_UDEV_KMS
>  static Bool
> @@ -302,8 +304,17 @@ device_added(struct udev_device *udev_device)
>  
>      fd = systemd_logind_get_fd(devnum, path, &paused);
>  
> -    /* FIXME check paused, if paused put the device on a list for probing
> -       later */
> +    if (paused) {
> +        /* Put on new_input_devices list for delayed probe */
> +        new_input_devices = xnfrealloc(new_input_devices,
> +            sizeof(struct input_device_info) * (new_input_devices_count + 1));
> +        new_input_devices[new_input_devices_count] = input;
> +        new_input_devices_count++;
> +        if (fd != -1)
> +            close(fd);
> +        free(config_info);
> +        return;
> +    }
>  
>      add_input_device(&input, fd);
>  
> @@ -478,6 +489,26 @@ config_udev_fini(void)
>      udev_unref(udev);
>  }
>  
> +Bool
> +config_udev_delayed_probe(dev_t devnum, int fd)
> +{
> +    int i, j;
> +
> +    for (i = 0; i < new_input_devices_count; i++) {
> +        if (new_input_devices[i].devnum == devnum) {
> +            add_input_device(&new_input_devices[i], fd);
> +            free_input_device(&new_input_devices[i]);
> +
> +            for (j = i; j < new_input_devices_count - 1; j++)
> +                new_input_devices[j] = new_input_devices[j + 1];
> +            new_input_devices_count--;
> +
> +            return TRUE;
> +        }
> +    }
> +    return FALSE;
> +}
> +
>  #ifdef CONFIG_UDEV_KMS
>  
>  static Bool
> diff --git a/hw/xfree86/os-support/linux/systemd-logind.c b/hw/xfree86/os-support/linux/systemd-logind.c
> index f8be375..a7a598c 100644
> --- a/hw/xfree86/os-support/linux/systemd-logind.c
> +++ b/hw/xfree86/os-support/linux/systemd-logind.c
> @@ -35,6 +35,7 @@
>  
>  #include "os.h"
>  #include "dbus-core.h"
> +#include "hotplug.h"
>  #include "xf86.h"
>  #include "xf86platformBus.h"
>  #include "xf86Xinput.h"
> @@ -310,6 +311,9 @@ message_filter(DBusConnection * connection, DBusMessage * message, void *data)
>              dbus_error_free(&error);
>              return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
>          }
> +
> +        if (config_udev_delayed_probe(makedev(major, minor), fd))
> +            return DBUS_HANDLER_RESULT_HANDLED;
>      } else
>          return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
>  
> diff --git a/include/hotplug.h b/include/hotplug.h
> index 567edfc..db1bf92 100644
> --- a/include/hotplug.h
> +++ b/include/hotplug.h
> @@ -76,6 +76,10 @@ void NewGPUDeviceRequest(struct OdevAttributes *attribs);
>  void DeleteGPUDeviceRequest(struct OdevAttributes *attribs);
>  #endif
>  
> +#ifdef CONFIG_UDEV
> +Bool config_udev_delayed_probe(dev_t devnum, int fd);
> +#endif
> +
>  #define ServerIsNotSeat0() (SeatId && strcmp(SeatId, "seat0"))
>  
>  struct xf86_platform_device *
> -- 
> 1.8.4.2
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list