[Spice-devel] [PATCH v6 02/14] usbredir: Introduce mutex for device (dis)connection

Jonathon Jongsma jjongsma at redhat.com
Mon Feb 29 22:55:25 UTC 2016


On Sun, 2016-02-28 at 11:54 +0200, Dmitry Fleytman wrote:
> From: Kirill Moizik <kmoizik at redhat.com>
> 
> This commit introduces channel mutex to allow usage of
> channel objects in mutithreaded environments.
> 
> This mutex will be used by future commits to protect
> thread unsafe usbredir functions and data structures.
> 
> Signed-off-by: Kirill Moizik <kmoizik at redhat.com>
> Signed-off-by: Dmitry Fleytman <dfleytma at redhat.com>
> ---
>  src/channel-usbredir-priv.h |  4 ++++
>  src/channel-usbredir.c      | 19 +++++++++++++++++++
>  2 files changed, 23 insertions(+)
> 
> diff --git a/src/channel-usbredir-priv.h b/src/channel-usbredir-priv.h
> index 2c4c6f7..c987474 100644
> --- a/src/channel-usbredir-priv.h
> +++ b/src/channel-usbredir-priv.h
> @@ -51,6 +51,10 @@ void
> spice_usbredir_channel_disconnect_device(SpiceUsbredirChannel *channel);
>  
>  libusb_device *spice_usbredir_channel_get_device(SpiceUsbredirChannel
> *channel);
>  
> +void spice_usbredir_channel_lock(SpiceUsbredirChannel *channel);
> +
> +void spice_usbredir_channel_unlock(SpiceUsbredirChannel *channel);
> +
>  void spice_usbredir_channel_get_guest_filter(
>                            SpiceUsbredirChannel               *channel,
>                            const struct usbredirfilter_rule  **rules_ret,
> diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
> index c236ee7..c91b3f7 100644
> --- a/src/channel-usbredir.c
> +++ b/src/channel-usbredir.c
> @@ -79,6 +79,7 @@ struct _SpiceUsbredirChannelPrivate {
>      GSimpleAsyncResult *result;
>      SpiceUsbAclHelper *acl_helper;
>  #endif
> +    GMutex *device_connect_mutex;

As Frediano suggested in reply to an earlier version of this patch, I think
allocating the full structure here would be simpler.

>  };
>  
>  static void channel_set_handlers(SpiceChannelClass *klass);
> @@ -107,6 +108,8 @@ static void
> spice_usbredir_channel_init(SpiceUsbredirChannel *channel)
>  {
>  #ifdef USE_USBREDIR
>      channel->priv = SPICE_USBREDIR_CHANNEL_GET_PRIVATE(channel);
> +    channel->priv->device_connect_mutex = g_new0(GMutex, 1);
> +    g_mutex_init(channel->priv->device_connect_mutex);

g_mutex_init() requires glib >= 2.32. configure.ac should be updated since it
only requires 2.28 right now.

>  #endif
>  }
>  
> @@ -182,6 +185,10 @@ static void spice_usbredir_channel_finalize(GObject *obj)
>  
>      if (channel->priv->host)
>          usbredirhost_close(channel->priv->host);
> +#ifdef USE_USBREDIR
> +    g_mutex_clear(channel->priv->device_connect_mutex);
> +    g_free(channel->priv->device_connect_mutex);
> +#endif
>  
>      /* Chain up to the parent class */
>      if (G_OBJECT_CLASS(spice_usbredir_channel_parent_class)->finalize)
> @@ -561,6 +568,18 @@ static void *usbredir_alloc_lock(void) {
>  #endif
>  }
>  
> +void spice_usbredir_channel_lock(SpiceUsbredirChannel *channel)
> +{
> +    g_return_if_fail(SPICE_IS_USBREDIR_CHANNEL(channel));
> +    g_mutex_lock(channel->priv->device_connect_mutex);
> +}
> +
> +void spice_usbredir_channel_unlock(SpiceUsbredirChannel *channel)
> +{
> +    g_return_if_fail(SPICE_IS_USBREDIR_CHANNEL(channel));
> +    g_mutex_unlock(channel->priv->device_connect_mutex);
> +}
> +
>  static void usbredir_lock_lock(void *user_data) {
>      GMutex *mutex = user_data;
>  


More information about the Spice-devel mailing list