summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Moizik <kmoizik@redhat.com>2016-03-08 16:05:49 +0200
committerJonathon Jongsma <jjongsma@redhat.com>2016-03-24 11:00:01 -0500
commit8ed40007bd9f441c5e530bfbec6ae72c9b2accfe (patch)
treed7d41e09d129f44c9a8531657d25d63b29d1fb91
parent2a01b4a041cfe489549692be06b64034ce5ecfbf (diff)
usbredir: Introduce mutex for device (dis)connection
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@redhat.com> Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
-rw-r--r--src/channel-usbredir-priv.h4
-rw-r--r--src/channel-usbredir.c15
2 files changed, 19 insertions, 0 deletions
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 ab90800..ff238e5 100644
--- a/src/channel-usbredir.c
+++ b/src/channel-usbredir.c
@@ -78,6 +78,7 @@ struct _SpiceUsbredirChannelPrivate {
GTask *task;
SpiceUsbAclHelper *acl_helper;
#endif
+ STATIC_MUTEX device_connect_mutex;
};
static void channel_set_handlers(SpiceChannelClass *klass);
@@ -109,6 +110,7 @@ static void spice_usbredir_channel_init(SpiceUsbredirChannel *channel)
{
#ifdef USE_USBREDIR
channel->priv = SPICE_USBREDIR_CHANNEL_GET_PRIVATE(channel);
+ STATIC_MUTEX_INIT(channel->priv->device_connect_mutex);
#endif
}
@@ -184,6 +186,9 @@ static void spice_usbredir_channel_finalize(GObject *obj)
if (channel->priv->host)
usbredirhost_close(channel->priv->host);
+#ifdef USE_USBREDIR
+ STATIC_MUTEX_CLEAR(channel->priv->device_connect_mutex);
+#endif
/* Chain up to the parent class */
if (G_OBJECT_CLASS(spice_usbredir_channel_parent_class)->finalize)
@@ -566,6 +571,16 @@ static void *usbredir_alloc_lock(void) {
return mutex;
}
+void spice_usbredir_channel_lock(SpiceUsbredirChannel *channel)
+{
+ STATIC_MUTEX_LOCK(channel->priv->device_connect_mutex);
+}
+
+void spice_usbredir_channel_unlock(SpiceUsbredirChannel *channel)
+{
+ STATIC_MUTEX_UNLOCK(channel->priv->device_connect_mutex);
+}
+
static void usbredir_lock_lock(void *user_data) {
GMutex *mutex = user_data;