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

Dmitry Fleytman dmitry at daynix.com
Tue Mar 8 13:40:31 UTC 2016


> On 1 Mar 2016, at 24:55 AM, Jonathon Jongsma <jjongsma at redhat.com> wrote:
> 
> 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.

Yes, this is an artefact from previous versions, changed.

> 
>> };
>> 
>> 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.

We did not intend to introduce code that unconditionally requires newer GLib, I used STATIC_MUTEX* defines in the next version to preserve compatibility with older GLib versions.

> 
>> #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;

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20160308/8c9ca0e5/attachment.html>


More information about the Spice-devel mailing list