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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 1 Mar 2016, at 24:55 AM, Jonathon Jongsma <jjongsma@xxxxxxxxxx> wrote:

On Sun, 2016-02-28 at 11:54 +0200, Dmitry Fleytman wrote:
From: Kirill Moizik <kmoizik@xxxxxxxxxx>

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@xxxxxxxxxx>
Signed-off-by: Dmitry Fleytman <dfleytma@xxxxxxxxxx>
---
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;

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]