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' > + return; > + } > + > dev_count = g_udev_client_list_devices(self, &now_devs, &err, > __FUNCTION__); > g_return_if_fail(dev_count >= 0); > -- > 2.4.3 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel
Attachment:
pgpU3EDpyyeBn.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel