Re: [Spice-devel] [spice-gtk 10/13] win-usb-dev: maintain list of libusb devices

2019-03-18 Thread Yuri Benditovich
On Tue, Mar 12, 2019 at 7:22 PM Christophe Fergeau
 wrote:>> On Sun, Mar 10, 2019 at 04:46:09PM
+0200, Yuri Benditovich wrote:
> > Change internal device list to maintain libusb devices
> > instead of GUdevDevice objects. Create temporary
> > GUdevDevice object only for indication to usb-dev-manager.
> >
> > Signed-off-by: Yuri Benditovich 
> > ---
> >  src/win-usb-dev.c | 80 ++-
> >  1 file changed, 51 insertions(+), 29 deletions(-)
> >
> > diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
> > index 1ab704d..5d878ea 100644
> > --- a/src/win-usb-dev.c
> > +++ b/src/win-usb-dev.c
> > @@ -95,7 +95,7 @@ static void g_udev_device_print_list(GList *l, const 
> > gchar *msg);
> >  #else
> >  static void g_udev_device_print_list(GList *l, const gchar *msg) {}
> >  #endif
> > -static void g_udev_device_print(GUdevDevice *udev, const gchar *msg);
> > +static void g_udev_device_print(libusb_device *dev, const gchar *msg);
> >
> >  static gboolean g_udev_skip_search(libusb_device *dev);
> >
> > @@ -129,8 +129,6 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > **devs,
> >  gssize rc;
> >  libusb_device **lusb_list, **dev;
> >  GUdevClientPrivate *priv;
> > -GUdevDeviceInfo *udevinfo;
> > -GUdevDevice *udevice;
> >  ssize_t n;
> >
> >  g_return_val_if_fail(G_UDEV_IS_CLIENT(self), -1);
> > @@ -155,10 +153,7 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > **devs,
> >  if (g_udev_skip_search(*dev)) {
> >  continue;
> >  }
> > -udevinfo = g_new0(GUdevDeviceInfo, 1);
> > -get_usb_dev_info(*dev, udevinfo);
> > -udevice = g_udev_device_new(udevinfo);
> > -*devs = g_list_prepend(*devs, udevice);
> > +*devs = g_list_prepend(*devs, libusb_ref_device(*dev));
> >  n++;
> >  }
> >  libusb_free_device_list(lusb_list, 1);
> > @@ -166,11 +161,17 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > **devs,
> >  return n;
> >  }
> >
> > +static void unreference_libusb_device(gpointer data)
> > +{
> > +libusb_unref_device((libusb_device *)data);
> > +}
> > +
> >  static void g_udev_client_free_device_list(GList **devs)
> >  {
> >  g_return_if_fail(devs != NULL);
> >  if (*devs) {
> > -g_list_free_full(*devs, g_object_unref);
> > +/* avoiding casting of imported procedure to GDestroyNotify */
> > +g_list_free_full(*devs, unreference_libusb_device);
>
> Since all unreference_libusb_device is doing is blindly casting a void *
> to libusb_device *, I'd just use a cast to GDestroyNotify here rather
> than introduce an intermediate method. If you prefer to keep that
> intermediate helper, please remove the commit which I don't think is
> needed.
>
> >  *devs = NULL;
> >  }
> >  }
> > @@ -246,9 +247,22 @@ static void 
> > g_udev_client_initable_iface_init(GInitableIface *iface)
> >  iface->init = g_udev_client_initable_init;
> >  }
> >
> > +static void g_udev_notify_device(GUdevClient *self, libusb_device *dev, 
> > int add)
> > +{
> > +GUdevDeviceInfo *udevinfo;
> > +GUdevDevice *udevice;
> > +udevinfo = g_new0(GUdevDeviceInfo, 1);
> > +if (get_usb_dev_info(dev, udevinfo)) {
> > +udevice = g_udev_device_new(udevinfo);
> > +g_signal_emit(self, signals[UEVENT_SIGNAL], 0, udevice, add);
> > +} else {
> > +g_free(udevinfo);
> > +}
> > +}
> > +
> >  static void report_one_device(gpointer data, gpointer self)
> >  {
> > -g_signal_emit(self, signals[UEVENT_SIGNAL], 0, data, TRUE);
> > +g_udev_notify_device(self, data, TRUE);
> >  }
> >
> >  void g_udev_client_report_devices(GUdevClient *self)
> > @@ -388,18 +402,20 @@ static gboolean get_usb_dev_info(libusb_device *dev, 
> > GUdevDeviceInfo *udevinfo)
> >  }
> >
> >  /* comparing bus:addr and vid:pid */
> > -static gint gudev_devices_differ(gconstpointer a, gconstpointer b)
> > +static gint compare_libusb_devices(gconstpointer a, gconstpointer b)
> >  {
> > -GUdevDeviceInfo *ai, *bi;
> > +libusb_device *a_dev = (libusb_device *)a;
> > +libusb_device *b_dev = (libusb_device *)b;
> > +struct libusb_device_descriptor a_desc, b_desc;
> >  gboolean same_bus, same_addr, same_vid, same_pid;
> >
> > -ai = G_UDEV_DEVICE(a)->priv->udevinfo;
> > -bi = G_UDEV_DEVICE(b)->priv->udevinfo;
> > +libusb_get_device_descriptor(a_dev, _desc);
> > +libusb_get_device_descriptor(b_dev, _desc);
> >
> > -same_bus = (ai->bus == bi->bus);
> > -same_addr = (ai->addr == bi->addr);
> > -same_vid = (ai->vid == bi->vid);
> > -same_pid = (ai->pid == bi->pid);
> > +same_bus = libusb_get_bus_number(a_dev) == 
> > libusb_get_bus_number(b_dev);
> > +same_addr = libusb_get_device_address(a_dev) == 
> > libusb_get_device_address(b_dev);
> > +same_vid = (a_desc.idVendor == b_desc.idVendor);
> > +same_pid = (a_desc.idProduct == b_desc.idProduct);
> >
> >  return (same_bus && 

Re: [Spice-devel] [spice-gtk 10/13] win-usb-dev: maintain list of libusb devices

2019-03-13 Thread Christophe Fergeau
On Wed, Mar 13, 2019 at 09:36:06AM +0200, Yuri Benditovich wrote:
> On Tue, Mar 12, 2019 at 7:22 PM Christophe Fergeau  
> wrote:
> >
> > On Sun, Mar 10, 2019 at 04:46:09PM +0200, Yuri Benditovich wrote:
> > > Change internal device list to maintain libusb devices
> > > instead of GUdevDevice objects. Create temporary
> > > GUdevDevice object only for indication to usb-dev-manager.
> > >
> > > Signed-off-by: Yuri Benditovich 
> > > ---
> > >  src/win-usb-dev.c | 80 ++-
> > >  1 file changed, 51 insertions(+), 29 deletions(-)
> > >
> > > diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
> > > index 1ab704d..5d878ea 100644
> > > --- a/src/win-usb-dev.c
> > > +++ b/src/win-usb-dev.c
> > > @@ -95,7 +95,7 @@ static void g_udev_device_print_list(GList *l, const 
> > > gchar *msg);
> > >  #else
> > >  static void g_udev_device_print_list(GList *l, const gchar *msg) {}
> > >  #endif
> > > -static void g_udev_device_print(GUdevDevice *udev, const gchar *msg);
> > > +static void g_udev_device_print(libusb_device *dev, const gchar *msg);
> > >
> > >  static gboolean g_udev_skip_search(libusb_device *dev);
> > >
> > > @@ -129,8 +129,6 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > > **devs,
> > >  gssize rc;
> > >  libusb_device **lusb_list, **dev;
> > >  GUdevClientPrivate *priv;
> > > -GUdevDeviceInfo *udevinfo;
> > > -GUdevDevice *udevice;
> > >  ssize_t n;
> > >
> > >  g_return_val_if_fail(G_UDEV_IS_CLIENT(self), -1);
> > > @@ -155,10 +153,7 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > > **devs,
> > >  if (g_udev_skip_search(*dev)) {
> > >  continue;
> > >  }
> > > -udevinfo = g_new0(GUdevDeviceInfo, 1);
> > > -get_usb_dev_info(*dev, udevinfo);
> > > -udevice = g_udev_device_new(udevinfo);
> > > -*devs = g_list_prepend(*devs, udevice);
> > > +*devs = g_list_prepend(*devs, libusb_ref_device(*dev));
> > >  n++;
> > >  }
> > >  libusb_free_device_list(lusb_list, 1);
> > > @@ -166,11 +161,17 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > > **devs,
> > >  return n;
> > >  }
> > >
> > > +static void unreference_libusb_device(gpointer data)
> > > +{
> > > +libusb_unref_device((libusb_device *)data);
> > > +}
> > > +
> > >  static void g_udev_client_free_device_list(GList **devs)
> > >  {
> > >  g_return_if_fail(devs != NULL);
> > >  if (*devs) {
> > > -g_list_free_full(*devs, g_object_unref);
> > > +/* avoiding casting of imported procedure to GDestroyNotify */
> > > +g_list_free_full(*devs, unreference_libusb_device);
> >
> > Since all unreference_libusb_device is doing is blindly casting a void *
> > to libusb_device *, I'd just use a cast to GDestroyNotify here rather
> > than introduce an intermediate method. If you prefer to keep that
> 
> unreference_libusb_device not only 'blindly casts' pointers but also
> guarantees that libusb_unref_device is called with proper calling
> conventions. There was commit addressing similar issue
> https://gitlab.freedesktop.org/spice/spice-gtk/commit/558c967ecd230fa6ddde553f6206b1bfd86b40e7

oh, very good point, this is in my opinion important enough to be
mentioned in the commit log, and maybe in the comment.

> 
> > intermediate helper, please remove the commit which I don't think is
> > needed.
> 
> Which exact commit is not needed??

Sorry, I meant 'comment', not 'commit' :)

Christophe


signature.asc
Description: PGP signature
___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel

Re: [Spice-devel] [spice-gtk 10/13] win-usb-dev: maintain list of libusb devices

2019-03-13 Thread Yuri Benditovich
On Tue, Mar 12, 2019 at 7:22 PM Christophe Fergeau  wrote:
>
> On Sun, Mar 10, 2019 at 04:46:09PM +0200, Yuri Benditovich wrote:
> > Change internal device list to maintain libusb devices
> > instead of GUdevDevice objects. Create temporary
> > GUdevDevice object only for indication to usb-dev-manager.
> >
> > Signed-off-by: Yuri Benditovich 
> > ---
> >  src/win-usb-dev.c | 80 ++-
> >  1 file changed, 51 insertions(+), 29 deletions(-)
> >
> > diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
> > index 1ab704d..5d878ea 100644
> > --- a/src/win-usb-dev.c
> > +++ b/src/win-usb-dev.c
> > @@ -95,7 +95,7 @@ static void g_udev_device_print_list(GList *l, const 
> > gchar *msg);
> >  #else
> >  static void g_udev_device_print_list(GList *l, const gchar *msg) {}
> >  #endif
> > -static void g_udev_device_print(GUdevDevice *udev, const gchar *msg);
> > +static void g_udev_device_print(libusb_device *dev, const gchar *msg);
> >
> >  static gboolean g_udev_skip_search(libusb_device *dev);
> >
> > @@ -129,8 +129,6 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > **devs,
> >  gssize rc;
> >  libusb_device **lusb_list, **dev;
> >  GUdevClientPrivate *priv;
> > -GUdevDeviceInfo *udevinfo;
> > -GUdevDevice *udevice;
> >  ssize_t n;
> >
> >  g_return_val_if_fail(G_UDEV_IS_CLIENT(self), -1);
> > @@ -155,10 +153,7 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > **devs,
> >  if (g_udev_skip_search(*dev)) {
> >  continue;
> >  }
> > -udevinfo = g_new0(GUdevDeviceInfo, 1);
> > -get_usb_dev_info(*dev, udevinfo);
> > -udevice = g_udev_device_new(udevinfo);
> > -*devs = g_list_prepend(*devs, udevice);
> > +*devs = g_list_prepend(*devs, libusb_ref_device(*dev));
> >  n++;
> >  }
> >  libusb_free_device_list(lusb_list, 1);
> > @@ -166,11 +161,17 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> > **devs,
> >  return n;
> >  }
> >
> > +static void unreference_libusb_device(gpointer data)
> > +{
> > +libusb_unref_device((libusb_device *)data);
> > +}
> > +
> >  static void g_udev_client_free_device_list(GList **devs)
> >  {
> >  g_return_if_fail(devs != NULL);
> >  if (*devs) {
> > -g_list_free_full(*devs, g_object_unref);
> > +/* avoiding casting of imported procedure to GDestroyNotify */
> > +g_list_free_full(*devs, unreference_libusb_device);
>
> Since all unreference_libusb_device is doing is blindly casting a void *
> to libusb_device *, I'd just use a cast to GDestroyNotify here rather
> than introduce an intermediate method. If you prefer to keep that

unreference_libusb_device not only 'blindly casts' pointers but also
guarantees that libusb_unref_device is called with proper calling
conventions. There was commit addressing similar issue
https://gitlab.freedesktop.org/spice/spice-gtk/commit/558c967ecd230fa6ddde553f6206b1bfd86b40e7

> intermediate helper, please remove the commit which I don't think is
> needed.

Which exact commit is not needed??

>
> >  *devs = NULL;
> >  }
> >  }
> > @@ -246,9 +247,22 @@ static void 
> > g_udev_client_initable_iface_init(GInitableIface *iface)
> >  iface->init = g_udev_client_initable_init;
> >  }
> >
> > +static void g_udev_notify_device(GUdevClient *self, libusb_device *dev, 
> > int add)
> > +{
> > +GUdevDeviceInfo *udevinfo;
> > +GUdevDevice *udevice;
> > +udevinfo = g_new0(GUdevDeviceInfo, 1);
> > +if (get_usb_dev_info(dev, udevinfo)) {
> > +udevice = g_udev_device_new(udevinfo);
> > +g_signal_emit(self, signals[UEVENT_SIGNAL], 0, udevice, add);
> > +} else {
> > +g_free(udevinfo);
> > +}
> > +}
> > +
> >  static void report_one_device(gpointer data, gpointer self)
> >  {
> > -g_signal_emit(self, signals[UEVENT_SIGNAL], 0, data, TRUE);
> > +g_udev_notify_device(self, data, TRUE);
> >  }
> >
> >  void g_udev_client_report_devices(GUdevClient *self)
> > @@ -388,18 +402,20 @@ static gboolean get_usb_dev_info(libusb_device *dev, 
> > GUdevDeviceInfo *udevinfo)
> >  }
> >
> >  /* comparing bus:addr and vid:pid */
> > -static gint gudev_devices_differ(gconstpointer a, gconstpointer b)
> > +static gint compare_libusb_devices(gconstpointer a, gconstpointer b)
> >  {
> > -GUdevDeviceInfo *ai, *bi;
> > +libusb_device *a_dev = (libusb_device *)a;
> > +libusb_device *b_dev = (libusb_device *)b;
> > +struct libusb_device_descriptor a_desc, b_desc;
> >  gboolean same_bus, same_addr, same_vid, same_pid;
> >
> > -ai = G_UDEV_DEVICE(a)->priv->udevinfo;
> > -bi = G_UDEV_DEVICE(b)->priv->udevinfo;
> > +libusb_get_device_descriptor(a_dev, _desc);
> > +libusb_get_device_descriptor(b_dev, _desc);
> >
> > -same_bus = (ai->bus == bi->bus);
> > -same_addr = (ai->addr == bi->addr);
> > -same_vid = (ai->vid == bi->vid);
> > -same_pid = (ai->pid == bi->pid);
> > +

Re: [Spice-devel] [spice-gtk 10/13] win-usb-dev: maintain list of libusb devices

2019-03-12 Thread Christophe Fergeau
On Sun, Mar 10, 2019 at 04:46:09PM +0200, Yuri Benditovich wrote:
> Change internal device list to maintain libusb devices
> instead of GUdevDevice objects. Create temporary
> GUdevDevice object only for indication to usb-dev-manager.
> 
> Signed-off-by: Yuri Benditovich 
> ---
>  src/win-usb-dev.c | 80 ++-
>  1 file changed, 51 insertions(+), 29 deletions(-)
> 
> diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
> index 1ab704d..5d878ea 100644
> --- a/src/win-usb-dev.c
> +++ b/src/win-usb-dev.c
> @@ -95,7 +95,7 @@ static void g_udev_device_print_list(GList *l, const gchar 
> *msg);
>  #else
>  static void g_udev_device_print_list(GList *l, const gchar *msg) {}
>  #endif
> -static void g_udev_device_print(GUdevDevice *udev, const gchar *msg);
> +static void g_udev_device_print(libusb_device *dev, const gchar *msg);
>  
>  static gboolean g_udev_skip_search(libusb_device *dev);
>  
> @@ -129,8 +129,6 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> **devs,
>  gssize rc;
>  libusb_device **lusb_list, **dev;
>  GUdevClientPrivate *priv;
> -GUdevDeviceInfo *udevinfo;
> -GUdevDevice *udevice;
>  ssize_t n;
>  
>  g_return_val_if_fail(G_UDEV_IS_CLIENT(self), -1);
> @@ -155,10 +153,7 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> **devs,
>  if (g_udev_skip_search(*dev)) {
>  continue;
>  }
> -udevinfo = g_new0(GUdevDeviceInfo, 1);
> -get_usb_dev_info(*dev, udevinfo);
> -udevice = g_udev_device_new(udevinfo);
> -*devs = g_list_prepend(*devs, udevice);
> +*devs = g_list_prepend(*devs, libusb_ref_device(*dev));
>  n++;
>  }
>  libusb_free_device_list(lusb_list, 1);
> @@ -166,11 +161,17 @@ g_udev_client_list_devices(GUdevClient *self, GList 
> **devs,
>  return n;
>  }
>  
> +static void unreference_libusb_device(gpointer data)
> +{
> +libusb_unref_device((libusb_device *)data);
> +}
> +
>  static void g_udev_client_free_device_list(GList **devs)
>  {
>  g_return_if_fail(devs != NULL);
>  if (*devs) {
> -g_list_free_full(*devs, g_object_unref);
> +/* avoiding casting of imported procedure to GDestroyNotify */
> +g_list_free_full(*devs, unreference_libusb_device);

Since all unreference_libusb_device is doing is blindly casting a void *
to libusb_device *, I'd just use a cast to GDestroyNotify here rather
than introduce an intermediate method. If you prefer to keep that
intermediate helper, please remove the commit which I don't think is
needed.

>  *devs = NULL;
>  }
>  }
> @@ -246,9 +247,22 @@ static void 
> g_udev_client_initable_iface_init(GInitableIface *iface)
>  iface->init = g_udev_client_initable_init;
>  }
>  
> +static void g_udev_notify_device(GUdevClient *self, libusb_device *dev, int 
> add)
> +{
> +GUdevDeviceInfo *udevinfo;
> +GUdevDevice *udevice;
> +udevinfo = g_new0(GUdevDeviceInfo, 1);
> +if (get_usb_dev_info(dev, udevinfo)) {
> +udevice = g_udev_device_new(udevinfo);
> +g_signal_emit(self, signals[UEVENT_SIGNAL], 0, udevice, add);
> +} else {
> +g_free(udevinfo);
> +}
> +}
> +
>  static void report_one_device(gpointer data, gpointer self)
>  {
> -g_signal_emit(self, signals[UEVENT_SIGNAL], 0, data, TRUE);
> +g_udev_notify_device(self, data, TRUE);
>  }
>  
>  void g_udev_client_report_devices(GUdevClient *self)
> @@ -388,18 +402,20 @@ static gboolean get_usb_dev_info(libusb_device *dev, 
> GUdevDeviceInfo *udevinfo)
>  }
>  
>  /* comparing bus:addr and vid:pid */
> -static gint gudev_devices_differ(gconstpointer a, gconstpointer b)
> +static gint compare_libusb_devices(gconstpointer a, gconstpointer b)
>  {
> -GUdevDeviceInfo *ai, *bi;
> +libusb_device *a_dev = (libusb_device *)a;
> +libusb_device *b_dev = (libusb_device *)b;
> +struct libusb_device_descriptor a_desc, b_desc;
>  gboolean same_bus, same_addr, same_vid, same_pid;
>  
> -ai = G_UDEV_DEVICE(a)->priv->udevinfo;
> -bi = G_UDEV_DEVICE(b)->priv->udevinfo;
> +libusb_get_device_descriptor(a_dev, _desc);
> +libusb_get_device_descriptor(b_dev, _desc);
>  
> -same_bus = (ai->bus == bi->bus);
> -same_addr = (ai->addr == bi->addr);
> -same_vid = (ai->vid == bi->vid);
> -same_pid = (ai->pid == bi->pid);
> +same_bus = libusb_get_bus_number(a_dev) == libusb_get_bus_number(b_dev);
> +same_addr = libusb_get_device_address(a_dev) == 
> libusb_get_device_address(b_dev);
> +same_vid = (a_desc.idVendor == b_desc.idVendor);
> +same_pid = (a_desc.idProduct == b_desc.idProduct);
>  
>  return (same_bus && same_addr && same_vid && same_pid) ? 0 : -1;
>  }
> @@ -412,10 +428,17 @@ static void notify_dev_state_change(GUdevClient *self,
>  GList *dev;
>  
>  for (dev = g_list_first(old_list); dev != NULL; dev = g_list_next(dev)) {
> -if (g_list_find_custom(new_list, dev->data,