From: Kirill Moizik <kmozik@xxxxxxxxxx> Mutex protect non thread safe usbredir functions and data structures integrity --- src/channel-usbredir-priv.h | 4 ++++ src/channel-usbredir.c | 22 ++++++++++++++++++++++ 2 files changed, 26 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 292b82f..69cb565 100644 --- a/src/channel-usbredir.c +++ b/src/channel-usbredir.c @@ -79,6 +79,7 @@ struct _SpiceUsbredirChannelPrivate { GSimpleAsyncResult *result; SpiceUsbAclHelper *acl_helper; #endif + GMutex *flows_mutex; }; 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->flows_mutex = g_new0(GMutex, 1); + g_mutex_init(channel->priv->flows_mutex); #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->flows_mutex); + g_free(channel->priv->flows_mutex); +#endif /* Chain up to the parent class */ if (G_OBJECT_CLASS(spice_usbredir_channel_parent_class)->finalize) @@ -558,6 +565,21 @@ static void *usbredir_alloc_lock(void) { #endif } +void spice_usbredir_channel_lock(SpiceUsbredirChannel *channel) +{ + g_return_if_fail(SPICE_IS_USBREDIR_CHANNEL(channel)); + SpiceUsbredirChannelPrivate *priv = channel->priv; + g_mutex_lock(priv->flows_mutex); + +} + +void spice_usbredir_channel_unlock(SpiceUsbredirChannel *channel) +{ + g_return_if_fail(SPICE_IS_USBREDIR_CHANNEL(channel)); + SpiceUsbredirChannelPrivate *priv = channel->priv; + g_mutex_unlock(priv->flows_mutex); +} + static void usbredir_lock_lock(void *user_data) { GMutex *mutex = user_data; -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel