[Spice-devel] [spice-gtk 08/13] usb-redir: change signal prototype of win-usb-dev
Yuri Benditovich
yuri.benditovich at daynix.com
Wed Mar 13 18:14:14 UTC 2019
On Tue, Mar 12, 2019 at 4:02 PM Christophe Fergeau <cfergeau at redhat.com> wrote:
>
> On Sun, Mar 10, 2019 at 04:46:07PM +0200, Yuri Benditovich wrote:
> > Changing signal definition from (boxed-boxed) to (pointer,int).
> > There is no need for additional referencing of GUdevDevice
> > object before signal callback.
>
> I still feel it would be nicer to guarantee the GUdevDevice will stay
> alive for the whole duration of the signal emission. For example, 2
> callbacks may be attached to this signal, we don't want the first one to
> be able to drop the last ref to the GUdevDevice and risking the second
> one trying to use freed memory.
>
Additional referencing here is not required. The signal callback does not
dereference the GUdevDevice object, so this does not make any difference
how many callbacks attached to the signal.
> > Second parameter (action) is 0 for device removal and 1 for device
> > addition.
>
> Imo this should either be a gboolean or an enum.
I do not see any reason to invent additional marshalling procedure where
existing one can be used without any problem.
>
> >
> > Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
> > ---
> > src/usb-device-manager.c | 8 ++++----
> > src/win-usb-dev.c | 18 +++++++++---------
> > src/win-usb-dev.h | 2 +-
> > 3 files changed, 14 insertions(+), 14 deletions(-)
> >
> > diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
> > index f7b43f0..c1a0c92 100644
> > --- a/src/usb-device-manager.c
> > +++ b/src/usb-device-manager.c
> > @@ -153,8 +153,8 @@ static void channel_event(SpiceChannel *channel, SpiceChannelEvent event,
> > gpointer user_data);
> > #ifdef G_OS_WIN32
> > static void spice_usb_device_manager_uevent_cb(GUdevClient *client,
> > - const gchar *action,
> > GUdevDevice *udevice,
> > + int add,
> > gpointer user_data);
> > static void spice_usb_device_manager_add_udev(SpiceUsbDeviceManager *self,
> > GUdevDevice *udev);
> > @@ -1070,15 +1070,15 @@ static void spice_usb_device_manager_remove_udev(SpiceUsbDeviceManager *self,
> > }
> >
> > static void spice_usb_device_manager_uevent_cb(GUdevClient *client,
> > - const gchar *action,
> > GUdevDevice *udevice,
> > + int add,
> > gpointer user_data)
> > {
> > SpiceUsbDeviceManager *self = SPICE_USB_DEVICE_MANAGER(user_data);
> >
> > - if (g_str_equal(action, "add"))
> > + if (add)
> > spice_usb_device_manager_add_udev(self, udevice);
> > - else if (g_str_equal (action, "remove"))
> > + else
> > spice_usb_device_manager_remove_udev(self, udevice);
> > }
> > #else
> > diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
> > index 2c122cf..c74dd57 100644
> > --- a/src/win-usb-dev.c
> > +++ b/src/win-usb-dev.c
> > @@ -249,7 +249,7 @@ static void g_udev_client_initable_iface_init(GInitableIface *iface)
> >
> > static void report_one_device(gpointer data, gpointer self)
> > {
> > - g_signal_emit(self, signals[UEVENT_SIGNAL], 0, "add", data);
> > + g_signal_emit(self, signals[UEVENT_SIGNAL], 0, data, TRUE);
>
> Ok, so the signal would use a gboolean
>
> > }
> >
> > void g_udev_client_report_devices(GUdevClient *self)
> > @@ -342,11 +342,11 @@ static void g_udev_client_class_init(GUdevClientClass *klass)
> > G_SIGNAL_RUN_FIRST,
> > G_STRUCT_OFFSET(GUdevClientClass, uevent),
> > NULL, NULL,
> > - g_cclosure_user_marshal_VOID__BOXED_BOXED,
> > + g_cclosure_user_marshal_VOID__POINTER_INT,
>
> This can be g_cclosure_user_marshal_VOID__POINTER_BOOLEAN once
> src/spice-marshal.txt has VOID:POINTER,BOOLEAN
>
> > G_TYPE_NONE,
> > 2,
> > - G_TYPE_STRING,
> > - G_UDEV_TYPE_DEVICE);
> > + G_TYPE_POINTER,
> > + G_TYPE_INT);
> >
> > /**
> > * GUdevClient::redirecting:
> > @@ -408,15 +408,15 @@ static gint gudev_devices_differ(gconstpointer a, gconstpointer b)
> > static void notify_dev_state_change(GUdevClient *self,
> > GList *old_list,
> > GList *new_list,
> > - const gchar *action)
> > + int add)
> > {
> > 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, gudev_devices_differ) == NULL) {
> > /* Found a device that changed its state */
> > - g_udev_device_print(dev->data, action);
> > - g_signal_emit(self, signals[UEVENT_SIGNAL], 0, action, dev->data);
> > + g_udev_device_print(dev->data, add ? "add" : "remove");
> > + g_signal_emit(self, signals[UEVENT_SIGNAL], 0, dev->data, add);
> > }
> > }
> > }
> > @@ -445,10 +445,10 @@ static void handle_dev_change(GUdevClient *self)
> > g_udev_device_print_list(priv->udev_list, "handle_dev_change: previous list:");
> >
> > /* Unregister devices that are not present anymore */
> > - notify_dev_state_change(self, priv->udev_list, now_devs, "remove");
> > + notify_dev_state_change(self, priv->udev_list, now_devs, FALSE);
> >
> > /* Register newly inserted devices */
> > - notify_dev_state_change(self, now_devs, priv->udev_list, "add");
> > + notify_dev_state_change(self, now_devs, priv->udev_list, TRUE);
> >
> > /* keep most recent info: free previous list, and keep current list */
> > g_udev_client_free_device_list(&priv->udev_list);
> > diff --git a/src/win-usb-dev.h b/src/win-usb-dev.h
> > index bca8285..96725b8 100644
> > --- a/src/win-usb-dev.h
> > +++ b/src/win-usb-dev.h
> > @@ -75,7 +75,7 @@ struct _GUdevClientClass
> > GObjectClass parent_class;
> >
> > /* signals */
> > - void (*uevent)(GUdevClient *client, const gchar *action, GUdevDevice *device);
> > + void (*uevent)(GUdevClient *client, GUdevDevice *device, int add);
> > };
> >
> > GType g_udev_client_get_type(void) G_GNUC_CONST;
> > --
> > 2.17.1
> >
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
> -----BEGIN PGP SIGNATURE-----
>
> iQIzBAEBCAAdFiEElKn3VmH3emFoZJsjqdjCFCmsbIIFAlyHu/0ACgkQqdjCFCms
> bILnhw/+Nks653B1Drb//RsVGI3bc/f5UKbJMCkZ0UMLg9pbq3kInx9NOYjY7j9S
> hyiiWD3tNzOOxhMZKCh+hfPByeTl8HZVUkMh67XWQG7MOj/eZ/P88k+ym4iWpw7F
> QivAzRUT7ab+z3g7YpYBv3q1EUpeVlRaqQsPTZOfhVdU/aBUGXm0B3T5WDvwZaqp
> /hvMPqsR8QhOHORxgc9Ciqt/mQZSFGhATQ8cPqp3QAi3UogUaqAidL7SUbGTHr+s
> kQXlbp7sE/UU7mb9zOqwKyRx4FHABHnsqhNM12JbkaIwDsp8FYFcG1FO1r5sL6ki
> D3ZuLnkphO1dPVZQKddIjitO3+qUpYD9OzF1bjeUiaR/bMtO9FP9O9CLIVtHZmrx
> pXM+1HJcPSzJAHHyTe0q6p9TS2q/zWoDgpi2NVZ/PB0716zNHKPkAhzMXS1AWPJv
> sT1dVtg2XhFlXbt/d0FLp6W8VijUJjSE5YtPQF6Ka+JvvzelIvtJQqNAosWEuZnc
> W9aCU2HPPSB5qoICMYVzfY+9t+KWfxJR7aJQ6u2GvB52bQ5pGxc/fOVE0EDObVz3
> 4f98AZv6fgu0gCoWJHE8X9x+cu/TYdF/8xHP/zHBq/k86Y87xgURVh9YLBoUfXgY
> LezVr6GsfFM9ZEK8B0eVek8PH0jDjYckX8X0t6q4z9WH5Byre9Q=
> =5UVR
> -----END PGP SIGNATURE-----
More information about the Spice-devel
mailing list