summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2016-06-29 16:48:18 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2016-06-30 15:27:15 +0200
commiteaededfa67fe6363c26d2b14e604ad17eeb4d4df (patch)
treea4cbe847786393c294280206bbe7e0450f4d97c7
parent8c3a78e4bdc51fc2319c2bc8ccda5557786648c5 (diff)
usbredir: Use atomic for UsbDeviceManager::event_thread_run
This variable is accessed from 2 different threads (main thread and USB event thread), so some care must be taken to read/write it.
-rw-r--r--src/usb-device-manager.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index 1fc8fc1..808ec6c 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -112,7 +112,7 @@ struct _SpiceUsbDeviceManagerPrivate {
libusb_context *context;
int event_listeners;
GThread *event_thread;
- gboolean event_thread_run;
+ gint event_thread_run;
struct usbredirfilter_rule *auto_conn_filter_rules;
struct usbredirfilter_rule *redirect_on_connect_rules;
int auto_conn_filter_rules_count;
@@ -380,7 +380,7 @@ static void spice_usb_device_manager_dispose(GObject *gobject)
priv->hp_handle = 0;
}
#endif
- if (priv->event_thread && !priv->event_thread_run) {
+ if (priv->event_thread && !g_atomic_int_get(&priv->event_thread_run)) {
g_thread_join(priv->event_thread);
priv->event_thread = NULL;
}
@@ -1280,7 +1280,7 @@ static gpointer spice_usb_device_manager_usb_ev_thread(gpointer user_data)
SpiceUsbDeviceManagerPrivate *priv = self->priv;
int rc;
- while (priv->event_thread_run) {
+ while (g_atomic_int_get(&priv->event_thread_run)) {
rc = libusb_handle_events(priv->context);
if (rc && rc != LIBUSB_ERROR_INTERRUPTED) {
const char *desc = spice_usbutil_libusb_strerror(rc);
@@ -1310,7 +1310,7 @@ gboolean spice_usb_device_manager_start_event_listening(
g_thread_join(priv->event_thread);
priv->event_thread = NULL;
}
- priv->event_thread_run = TRUE;
+ g_atomic_int_set(&priv->event_thread_run, TRUE);
priv->event_thread = g_thread_new("usb_ev_thread",
spice_usb_device_manager_usb_ev_thread,
self);
@@ -1326,7 +1326,7 @@ void spice_usb_device_manager_stop_event_listening(
priv->event_listeners--;
if (priv->event_listeners == 0)
- priv->event_thread_run = FALSE;
+ g_atomic_int_set(&priv->event_thread_run, FALSE);
}
static void spice_usb_device_manager_check_redir_on_connect(