[PATCH xf86-input-libinput 1/2] Revamp server fd opening
Hans de Goede
hdegoede at redhat.com
Thu Aug 13 10:08:42 PDT 2015
Hi,
On 13-08-15 05:08, Peter Hutterer wrote:
> The server already stores the server-fd in the options, so we only need to run
> through the list of current devices, find a match and extract that fd from the
> options. Less magic in our driver and it gives us a pInfo handle in
> open_restricted which we'll can use for xf86OpenSerial().
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Good idea, and this results in a nice cleanup, series is:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> src/xf86libinput.c | 127 ++++++++++++++++-------------------------------------
> 1 file changed, 39 insertions(+), 88 deletions(-)
>
> diff --git a/src/xf86libinput.c b/src/xf86libinput.c
> index 041aedf..b468d7f 100644
> --- a/src/xf86libinput.c
> +++ b/src/xf86libinput.c
> @@ -113,80 +113,11 @@ struct xf86libinput {
> } options;
> };
>
> -/*
> - libinput provides a userdata for the context, but not per path device. so
> - the open_restricted call has the libinput context, but no reference to
> - the pInfo->fd that we actually need to return.
> - To avoid this, we store each path/fd combination during pre_init in the
> - context, then return that during open_restricted. If a device is added
> - twice with two different fds this may give us the wrong fd but why are
> - you doing that anyway.
> - */
> -struct serverfd {
> - struct xorg_list node;
> - int fd;
> - char *path;
> -};
> -
> static inline int
> use_server_fd(const InputInfoPtr pInfo) {
> return pInfo->fd > -1 && (pInfo->flags & XI86_SERVER_FD);
> }
>
> -static inline void
> -fd_push(struct xf86libinput_driver *context,
> - int fd,
> - const char *path)
> -{
> - struct serverfd *sfd = xnfcalloc(1, sizeof(*sfd));
> -
> - sfd->fd = fd;
> - sfd->path = xnfstrdup(path);
> - xorg_list_add(&sfd->node, &context->server_fds);
> -}
> -
> -static inline int
> -fd_get(struct xf86libinput_driver *context,
> - const char *path)
> -{
> - struct serverfd *sfd;
> -
> - xorg_list_for_each_entry(sfd, &context->server_fds, node) {
> - if (strcmp(path, sfd->path) == 0)
> - return sfd->fd;
> - }
> -
> - return -1;
> -}
> -
> -static inline void
> -fd_pop(struct xf86libinput_driver *context, int fd)
> -{
> - struct serverfd *sfd;
> -
> - xorg_list_for_each_entry(sfd, &context->server_fds, node) {
> - if (fd != sfd->fd)
> - continue;
> -
> - xorg_list_del(&sfd->node);
> - free(sfd->path);
> - free(sfd);
> - break;
> - }
> -}
> -
> -static inline int
> -fd_find(struct xf86libinput_driver *context, int fd)
> -{
> - struct serverfd *sfd;
> -
> - xorg_list_for_each_entry(sfd, &context->server_fds, node) {
> - if (fd == sfd->fd)
> - return fd;
> - }
> - return -1;
> -}
> -
> static inline unsigned int
> btn_linux2xorg(unsigned int b)
> {
> @@ -355,12 +286,6 @@ xf86libinput_on(DeviceIntPtr dev)
> struct libinput *libinput = driver_context.libinput;
> struct libinput_device *device = driver_data->device;
>
> - if (use_server_fd(pInfo)) {
> - char *path = xf86SetStrOption(pInfo->options, "Device", NULL);
> - fd_push(&driver_context, pInfo->fd, path);
> - free(path);
> - }
> -
> device = libinput_path_add_device(libinput, driver_data->path);
> if (!device)
> return !Success;
> @@ -399,7 +324,6 @@ xf86libinput_off(DeviceIntPtr dev)
> }
>
> if (use_server_fd(pInfo)) {
> - fd_pop(&driver_context, pInfo->fd);
> pInfo->fd = xf86SetIntOption(pInfo->options, "fd", -1);
> } else {
> pInfo->fd = -1;
> @@ -965,13 +889,36 @@ xf86libinput_read_input(InputInfoPtr pInfo)
> }
> }
>
> +/*
> + libinput provides a userdata for the context, but not per path device. so
> + the open_restricted call has the libinput context, but no reference to
> + the pInfo->fd that we actually need to return.
> + The server stores the fd in the options though, so we just get it from
> + there. If a device is added twice with two different fds this may give us
> + the wrong fd but why are you doing that anyway.
> + */
> static int
> open_restricted(const char *path, int flags, void *data)
> {
> - struct xf86libinput_driver *context = data;
> - int fd;
> + InputInfoPtr pInfo;
> + int fd = -1;
> +
> + nt_list_for_each_entry(pInfo, xf86FirstLocalDevice(), next) {
> + char *device = xf86CheckStrOption(pInfo->options, "Device", NULL);
> +
> + if (strcmp(path, device) == 0) {
> + fd = xf86CheckIntOption(pInfo->options, "fd", -1);
> + free(device);
> + break;
> + }
> + free(device);
> + }
> +
> + if (pInfo == NULL) {
> + xf86Msg(X_ERROR, "Failed to look up path '%s'\n", path);
> + return -ENODEV;
> + }
>
> - fd = fd_get(context, path);
> if (fd == -1)
> fd = open(path, flags);
> return fd < 0 ? -errno : fd;
> @@ -980,9 +927,20 @@ open_restricted(const char *path, int flags, void *data)
> static void
> close_restricted(int fd, void *data)
> {
> - struct xf86libinput_driver *context = data;
> + InputInfoPtr pInfo;
> + int server_fd = -1;
> + BOOL found = FALSE;
>
> - if (fd_find(context, fd) == -1)
> + nt_list_for_each_entry(pInfo, xf86FirstLocalDevice(), next) {
> + server_fd = xf86CheckIntOption(pInfo->options, "fd", -1);
> +
> + if (server_fd == fd) {
> + found = TRUE;
> + break;
> + }
> + }
> +
> + if (!found)
> close(fd);
> }
>
> @@ -1483,9 +1441,6 @@ xf86libinput_pre_init(InputDriverPtr drv,
> goto fail;
> }
>
> - if (use_server_fd(pInfo))
> - fd_push(&driver_context, pInfo->fd, path);
> -
> device = libinput_path_add_device(libinput, path);
> if (!device) {
> xf86IDrvMsg(pInfo, X_ERROR, "Failed to create a device for %s\n", path);
> @@ -1497,8 +1452,6 @@ xf86libinput_pre_init(InputDriverPtr drv,
> */
> libinput_device_ref(device);
> libinput_path_remove_device(device);
> - if (use_server_fd(pInfo))
> - fd_pop(&driver_context, pInfo->fd);
>
> pInfo->private = driver_data;
> driver_data->path = path;
> @@ -1524,8 +1477,6 @@ xf86libinput_pre_init(InputDriverPtr drv,
>
> return Success;
> fail:
> - if (use_server_fd(pInfo) && driver_context.libinput != NULL)
> - fd_pop(&driver_context, pInfo->fd);
> if (driver_data->valuators)
> valuator_mask_free(&driver_data->valuators);
> if (driver_data->valuators_unaccelerated)
>
More information about the xorg-devel
mailing list