[Spice-devel] [PATCH v6 02/14] usbredir: Introduce mutex for device (dis)connection
Dmitry Fleytman
dmitry at daynix.com
Sun Feb 28 09:54:12 UTC 2016
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;
};
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);
#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;
--
2.5.0
More information about the Spice-devel
mailing list