etrunko / rpms / spice-gtk

Forked from rpms/spice-gtk 4 years ago
Clone

Blame 0002-usbredir-Use-atomic-for-UsbDeviceManager-event_threa.patch

a089ec2
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
a089ec2
From: Christophe Fergeau <cfergeau@redhat.com>
a089ec2
Date: Wed, 29 Jun 2016 16:48:18 +0200
a089ec2
Subject: [PATCH] usbredir: Use atomic for UsbDeviceManager::event_thread_run
a089ec2
a089ec2
This variable is accessed from 2 different threads (main thread and USB
a089ec2
event thread), so some care must be taken to read/write it.
a089ec2
---
a089ec2
 src/usb-device-manager.c | 10 +++++-----
a089ec2
 1 file changed, 5 insertions(+), 5 deletions(-)
a089ec2
a089ec2
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
a089ec2
index 1fc8fc1..808ec6c 100644
a089ec2
--- a/src/usb-device-manager.c
a089ec2
+++ b/src/usb-device-manager.c
a089ec2
@@ -112,7 +112,7 @@ struct _SpiceUsbDeviceManagerPrivate {
a089ec2
     libusb_context *context;
a089ec2
     int event_listeners;
a089ec2
     GThread *event_thread;
a089ec2
-    gboolean event_thread_run;
a089ec2
+    gint event_thread_run;
a089ec2
     struct usbredirfilter_rule *auto_conn_filter_rules;
a089ec2
     struct usbredirfilter_rule *redirect_on_connect_rules;
a089ec2
     int auto_conn_filter_rules_count;
a089ec2
@@ -380,7 +380,7 @@ static void spice_usb_device_manager_dispose(GObject *gobject)
a089ec2
         priv->hp_handle = 0;
a089ec2
     }
a089ec2
 #endif
a089ec2
-    if (priv->event_thread && !priv->event_thread_run) {
a089ec2
+    if (priv->event_thread && !g_atomic_int_get(&priv->event_thread_run)) {
a089ec2
         g_thread_join(priv->event_thread);
a089ec2
         priv->event_thread = NULL;
a089ec2
     }
a089ec2
@@ -1280,7 +1280,7 @@ static gpointer spice_usb_device_manager_usb_ev_thread(gpointer user_data)
a089ec2
     SpiceUsbDeviceManagerPrivate *priv = self->priv;
a089ec2
     int rc;
a089ec2
 
a089ec2
-    while (priv->event_thread_run) {
a089ec2
+    while (g_atomic_int_get(&priv->event_thread_run)) {
a089ec2
         rc = libusb_handle_events(priv->context);
a089ec2
         if (rc && rc != LIBUSB_ERROR_INTERRUPTED) {
a089ec2
             const char *desc = spice_usbutil_libusb_strerror(rc);
a089ec2
@@ -1310,7 +1310,7 @@ gboolean spice_usb_device_manager_start_event_listening(
a089ec2
          g_thread_join(priv->event_thread);
a089ec2
          priv->event_thread = NULL;
a089ec2
     }
a089ec2
-    priv->event_thread_run = TRUE;
a089ec2
+    g_atomic_int_set(&priv->event_thread_run, TRUE);
a089ec2
     priv->event_thread = g_thread_new("usb_ev_thread",
a089ec2
                                       spice_usb_device_manager_usb_ev_thread,
a089ec2
                                       self);
a089ec2
@@ -1326,7 +1326,7 @@ void spice_usb_device_manager_stop_event_listening(
a089ec2
 
a089ec2
     priv->event_listeners--;
a089ec2
     if (priv->event_listeners == 0)
a089ec2
-        priv->event_thread_run = FALSE;
a089ec2
+        g_atomic_int_set(&priv->event_thread_run, FALSE);
a089ec2
 }
a089ec2
 
a089ec2
 static void spice_usb_device_manager_check_redir_on_connect(