[Spice-devel] [PATCH spice-gtk 05/10] usbredir: Create USB event source on demand

Christophe Fergeau cfergeau at redhat.com
Fri Dec 23 09:40:58 PST 2011


Makes sense to me

Christophe

On Mon, Dec 19, 2011 at 12:24:38PM +0100, Hans de Goede wrote:
> This is a preparation patch for handling usb packet completion in a
> separate thread.
> 
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  gtk/Makefile.am               |    1 +
>  gtk/channel-usbredir.c        |   15 ++++++++++++
>  gtk/usb-device-manager-priv.h |   36 +++++++++++++++++++++++++++++
>  gtk/usb-device-manager.c      |   50 +++++++++++++++++++++++++++++++---------
>  4 files changed, 90 insertions(+), 12 deletions(-)
>  create mode 100644 gtk/usb-device-manager-priv.h
> 
> diff --git a/gtk/Makefile.am b/gtk/Makefile.am
> index b780882..9f208cc 100644
> --- a/gtk/Makefile.am
> +++ b/gtk/Makefile.am
> @@ -236,6 +236,7 @@ libspice_client_glib_2_0_la_SOURCES =	\
>  	smartcard-manager.c		\
>  	smartcard-manager-priv.h	\
>  	usb-device-manager.c		\
> +	usb-device-manager-priv.h	\
>  	$(GUSB_SRCS)			\
>  	$(USB_ACL_HELPER_SRCS)		\
>  	\
> diff --git a/gtk/channel-usbredir.c b/gtk/channel-usbredir.c
> index 58a4c21..26821c6 100644
> --- a/gtk/channel-usbredir.c
> +++ b/gtk/channel-usbredir.c
> @@ -30,6 +30,7 @@
>  #include "usb-acl-helper.h"
>  #endif
>  #include "channel-usbredir-priv.h"
> +#include "usb-device-manager-priv.h"
>  #endif
>  
>  #include "spice-client.h"
> @@ -197,6 +198,16 @@ static gboolean spice_usbredir_channel_open_device(
>          return FALSE;
>      }
>  
> +    if (!spice_usb_device_manager_start_event_listening(
> +            spice_usb_device_manager_get(
> +                spice_channel_get_session(SPICE_CHANNEL(channel)),
> +                NULL, NULL),
> +            err)) {
> +        usbredirhost_close(priv->host);
> +        priv->host = NULL;
> +        return FALSE;
> +    }
> +
>      spice_channel_connect(SPICE_CHANNEL(channel));
>      priv->state = STATE_CONNECTING;
>  
> @@ -335,6 +346,10 @@ void spice_usbredir_channel_disconnect(SpiceUsbredirChannel *channel)
>      case STATE_CONNECTING:
>      case STATE_CONNECTED:
>          spice_channel_disconnect(SPICE_CHANNEL(channel), SPICE_CHANNEL_NONE);
> +        spice_usb_device_manager_stop_event_listening(
> +            spice_usb_device_manager_get(
> +                spice_channel_get_session(SPICE_CHANNEL(channel)),
> +                NULL, NULL));
>          /* This also closes the libusb handle we passed to its _open */
>          usbredirhost_close(priv->host);
>          priv->host = NULL;
> diff --git a/gtk/usb-device-manager-priv.h b/gtk/usb-device-manager-priv.h
> new file mode 100644
> index 0000000..841c725
> --- /dev/null
> +++ b/gtk/usb-device-manager-priv.h
> @@ -0,0 +1,36 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> +   Copyright (C) 2011 Red Hat, Inc.
> +
> +   Red Hat Authors:
> +   Hans de Goede <hdegoede at redhat.com>
> +
> +   This library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   This library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with this library; if not, see <http://www.gnu.org/licenses/>.
> +*/
> +#ifndef __SPICE_USB_DEVICE_MANAGER_PRIV_H__
> +#define __SPICE_USB_DEVICE_MANAGER_PRIV_H__
> +
> +#include "usb-device-manager.h"
> +
> +G_BEGIN_DECLS
> +
> +gboolean spice_usb_device_manager_start_event_listening(
> +    SpiceUsbDeviceManager *manager, GError **err);
> +
> +void spice_usb_device_manager_stop_event_listening(
> +    SpiceUsbDeviceManager *manager);
> +
> +G_END_DECLS
> +
> +#endif /* __SPICE_USB_DEVICE_MANAGER_PRIV_H__ */
> diff --git a/gtk/usb-device-manager.c b/gtk/usb-device-manager.c
> index fcd1685..6fba6f6 100644
> --- a/gtk/usb-device-manager.c
> +++ b/gtk/usb-device-manager.c
> @@ -34,6 +34,7 @@
>  #include "spice-session-priv.h"
>  #include "spice-client.h"
>  #include "spice-marshal.h"
> +#include "usb-device-manager-priv.h"
>  
>  /**
>   * SECTION:usb-device-manager
> @@ -91,6 +92,7 @@ struct _SpiceUsbDeviceManagerPrivate {
>      GUsbContext *context;
>      GUsbDeviceList *devlist;
>      GUsbSource *source;
> +    int event_listeners;
>  #endif
>      GPtrArray *devices;
>      GPtrArray *channels;
> @@ -202,8 +204,6 @@ static void spice_usb_device_manager_finalize(GObject *gobject)
>      SpiceUsbDeviceManagerPrivate *priv = self->priv;
>  
>  #ifdef USE_USBREDIR
> -    if (priv->source)
> -        g_usb_source_destroy(priv->source);
>      if (priv->devlist) {
>          g_object_unref(priv->devlist);
>          g_object_unref(priv->context);
> @@ -476,10 +476,45 @@ static void spice_usb_device_manager_channel_connect_cb(
>      g_simple_async_result_complete(result);
>      g_object_unref(result);
>  }
> -#endif
>  
>  /* ------------------------------------------------------------------ */
>  /* private api                                                        */
> +
> +gboolean spice_usb_device_manager_start_event_listening(
> +    SpiceUsbDeviceManager *self, GError **err)
> +{
> +    SpiceUsbDeviceManagerPrivate *priv = self->priv;
> +
> +    g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
> +
> +    priv->event_listeners++;
> +    if (priv->event_listeners > 1)
> +        return TRUE;
> +
> +    g_return_val_if_fail(priv->source == NULL, FALSE);
> +
> +    priv->source = g_usb_source_new(priv->main_context, priv->context, err);
> +    return priv->source != NULL;
> +}
> +
> +void spice_usb_device_manager_stop_event_listening(
> +    SpiceUsbDeviceManager *self)
> +{
> +    SpiceUsbDeviceManagerPrivate *priv = self->priv;
> +
> +    g_return_if_fail(priv->event_listeners > 0);
> +
> +    priv->event_listeners--;
> +    if (priv->event_listeners != 0)
> +        return;
> +
> +    g_return_if_fail(priv->source != NULL);
> +
> +    g_usb_source_destroy(priv->source);
> +    priv->source = NULL;
> +}
> +#endif
> +
>  static SpiceUsbredirChannel *spice_usb_device_manager_get_channel_for_dev(
>      SpiceUsbDeviceManager *manager, SpiceUsbDevice *_device)
>  {
> @@ -603,7 +638,6 @@ void spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager *self,
>  
>  #ifdef USE_USBREDIR
>      SpiceUsbDeviceManagerPrivate *priv = self->priv;
> -    GError *e = NULL;
>      guint i;
>  
>      if (spice_usb_device_manager_is_device_connected(self, device)) {
> @@ -613,14 +647,6 @@ void spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager *self,
>          goto done;
>      }
>  
> -    if (!priv->source) {
> -        priv->source = g_usb_source_new(priv->main_context, priv->context, &e);
> -        if (e) {
> -            g_simple_async_result_take_error(result, e);
> -            goto done;
> -        }
> -    }
> -
>      for (i = 0; i < priv->channels->len; i++) {
>          SpiceUsbredirChannel *channel = g_ptr_array_index(priv->channels, i);
>  
> -- 
> 1.7.7.4
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20111223/1b039698/attachment.pgp>


More information about the Spice-devel mailing list