[Spice-devel] [PATCH v4 02/16] Usbredir channel: Introduce mutex for USB redirection

Dmitry Fleytman dmitry at daynix.com
Sun Aug 16 05:35:39 PDT 2015


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 to protect non thread safe
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 292b82f..a95db8a 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,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->flows_mutex);
+}
+
+void spice_usbredir_channel_unlock(SpiceUsbredirChannel *channel)
+{
+  g_return_if_fail(SPICE_IS_USBREDIR_CHANNEL(channel));
+  g_mutex_unlock(channel->priv->flows_mutex);
+}
+
 static void usbredir_lock_lock(void *user_data) {
     GMutex *mutex = user_data;
 
-- 
2.4.3



More information about the Spice-devel mailing list