-----------------------------------
On Sun, Aug 16, 2015 at 03:35:41PM +0300, Dmitry Fleytman wrote:From: Kirill Moizik <kmoizik@xxxxxxxxxx>
USB redirection flow on Windows includes a number of reset requests issued to the port that hosts the device deing redirected.
Each port reset emulates device removal and reinsertion and produces corresponding hotplug events and a number of device list updates on different levels of USB stack and USB redirection engine.
As a result, queriyng USB device list performed by spice-gtk's hotplug event handler may return inconsistens results if performed in parallel
'inconsistent'to redirection flow.
This patch suppresses handling of USB hotplug events during redirection and injects a simulated hotplug event after redirection completion in order to properly process real device list changes in case they happened during the redirection flow.
Signed-off-by: Kirill Moizik <kmoizik@xxxxxxxxxx> Signed-off-by: Dmitry Fleytman <dfleytma@xxxxxxxxxx> --- src/win-usb-dev.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c index 60bc434..78f1877 100644 --- a/src/win-usb-dev.c +++ b/src/win-usb-dev.c @@ -305,10 +305,18 @@ static void g_udev_client_set_property(GObject *gobject, { GUdevClient *self = G_UDEV_CLIENT(gobject); GUdevClientPrivate *priv = self->priv; + gboolean old_val;
switch (prop_id) { case PROP_REDIRECTING: + old_val = priv->redirecting; priv->redirecting = g_value_get_boolean(value); + if (old_val && !priv->redirecting) { + /* This is a redirection completion case. + Inject hotplug event in case we missed device changes + during redirection processing. */ + handle_dev_change(self); + } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); @@ -409,6 +417,15 @@ static void handle_dev_change(GUdevClient *self) GList *lit, *sit; /* iterators for long-list and short-list */ GUdevDevice *ldev, *sdev; /* devices on long-list and short-list */
+ if (priv->redirecting == TRUE) { + /* On Windows, queriyng USB device list may return inconsistent results
'querying'+ if performed in parallel to redirection flow. + A simulated hotplug event will be injected after redirection + completion in order to process real device list changes that may + had place during redirection process. */
'had taken place’
All 3 issues fixed. thanks.
|
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel