[Spice-devel] [PATCH 2/5] WinUsbDev: add redirecting state to GUdevClientPrivate

Kirill Moizik kirill at daynix.com
Thu Jul 2 06:41:32 PDT 2015


we need to add redirecting  state to singleton  since wnd_proc callback should not query usb devices
in the middle of redirecting flow. GUdevClient is the only context exist in the cb, so we should add a stateand update it accordingly.

Signed-off-by: Kirill Moizik <kirill at daynix.com>
---
 src/map-file      |  2 ++
 src/win-usb-dev.c | 15 +++++++++++++++
 src/win-usb-dev.h |  2 ++
 3 files changed, 19 insertions(+)

diff --git a/src/map-file b/src/map-file
index d3a079e..f9883b2 100644
--- a/src/map-file
+++ b/src/map-file
@@ -117,6 +117,8 @@ spice_uri_to_string;
 spice_usb_device_get_description;
 spice_usb_device_get_libusb_device;
 spice_usb_device_get_type;
+spice_g_udev_set_redirecting;
+spice_g_udev_handle_device_change;
 spice_usb_device_manager_set_redirecting;
 spice_usb_device_manager_get_redirecting;
 spice_usb_device_manager_can_redirect_device;
diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
index 1e4b2d6..23bea42 100644
--- a/src/win-usb-dev.c
+++ b/src/win-usb-dev.c
@@ -37,6 +37,7 @@ struct _GUdevClientPrivate {
     gssize udev_list_size;
     GList *udev_list;
     HWND hwnd;
+    gboolean redirecting;
 };
 
 #define G_UDEV_CLIENT_WINCLASS_NAME  TEXT("G_UDEV_CLIENT")
@@ -186,6 +187,7 @@ g_udev_client_initable_init(GInitable *initable, GCancellable *cancellable,
     self = G_UDEV_CLIENT(initable);
     priv = self->priv;
 
+    priv->redirecting = FALSE;
     rc = libusb_init(&priv->ctx);
     if (rc < 0) {
         const char *errstr = spice_usbutil_libusb_strerror(rc);
@@ -334,6 +336,11 @@ static gboolean gudev_devices_are_equal(GUdevDevice *a, GUdevDevice *b)
     return (same_pid && same_vid);
 }
 
+void spice_g_udev_set_redirecting (gboolean val)
+{
+    GUdevClientPrivate *priv = singleton->priv;
+    priv->redirecting = val;
+}
 
 /* Assumes each event stands for a single device change (at most) */
 static void handle_dev_change(GUdevClient *self)
@@ -347,6 +354,9 @@ static void handle_dev_change(GUdevClient *self)
     GList *llist, *slist; /* long-list and short-list*/
     GList *lit, *sit; /* iterators for long-list and short-list */
     GUdevDevice *ldev, *sdev; /* devices on long-list and short-list */
+    if (priv->redirecting == TRUE) {
+        return;
+    }
 
     dev_count = g_udev_client_list_devices(self, &now_devs, &err,
                                            __FUNCTION__);
@@ -409,6 +419,11 @@ leave:
     priv->udev_list_size = dev_count;
 }
 
+void spice_g_udev_handle_device_change(void)
+{
+    handle_dev_change(singleton);
+}
+
 static LRESULT CALLBACK wnd_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 {
     /* Only DBT_DEVNODES_CHANGED recieved */
diff --git a/src/win-usb-dev.h b/src/win-usb-dev.h
index b5c4fce..080c89f 100644
--- a/src/win-usb-dev.h
+++ b/src/win-usb-dev.h
@@ -86,6 +86,8 @@ GType g_udev_device_get_type(void) G_GNUC_CONST;
 const gchar *g_udev_device_get_property(GUdevDevice *udev, const gchar *property);
 const gchar *g_udev_device_get_sysfs_attr(GUdevDevice *udev, const gchar *attr);
 
+void   spice_g_udev_set_redirecting(gboolean val);
+void   spice_g_udev_handle_device_change(void);
 GQuark g_udev_client_error_quark(void);
 #define G_UDEV_CLIENT_ERROR g_udev_client_error_quark()
 
-- 
2.1.0



More information about the Spice-devel mailing list