Don't use static GMutexes.
authorGerald Combs <gerald@wireshark.org>
Wed, 24 Jan 2018 21:00:29 +0000 (13:00 -0800)
committerAnders Broman <a.broman58@gmail.com>
Thu, 25 Jan 2018 09:04:48 +0000 (09:04 +0000)
They're not supported in older versions of GLib.

Change-Id: I8342048bab90fb192b8d7f0253f8b3207be8c5b1
Reviewed-on: https://code.wireshark.org/review/25460
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
epan/register.c

index d655e64eb69e4277e657a23a66bf07832cc3b006..1567c4685dcc29c2bc20a61c66e9e2f0ae5dd58a 100644 (file)
 static const char *cur_cb_name = NULL;
 // We could use g_atomic_pointer_set/get instead of a mutex, but that's
 // currently (early 2018) invisible to TSAN.
-static GMutex cur_cb_name_mtx;
+static GMutex *cur_cb_name_mtx;
 static GAsyncQueue *register_cb_done_q;
 
 #define CB_WAIT_TIME (150 * 1000) // microseconds
 
 static void set_cb_name(const char *proto) {
-    g_mutex_lock(&cur_cb_name_mtx);
+    g_mutex_lock(cur_cb_name_mtx);
     cur_cb_name = proto;
-    g_mutex_unlock(&cur_cb_name_mtx);
+    g_mutex_unlock(cur_cb_name_mtx);
 }
 
 static void *
@@ -49,11 +49,18 @@ register_all_protocols(register_cb cb, gpointer cb_data)
     gboolean called_back = FALSE;
     GThread *rapw_thread;
 
+#if GLIB_CHECK_VERSION(2,32,0)
+    cur_cb_name_mtx = (GMutex *)g_malloc(sizeof(GMutex));
+    g_mutex_init(cur_cb_name_mtx);
+#else
+    cur_cb_name_mtx = g_mutex_new();
+#endif
+
     rapw_thread = g_thread_new("register_all_protocols_worker", &register_all_protocols_worker, NULL);
     while (!g_async_queue_timeout_pop(register_cb_done_q, CB_WAIT_TIME)) {
-        g_mutex_lock(&cur_cb_name_mtx);
+        g_mutex_lock(cur_cb_name_mtx);
         cb_name = cur_cb_name;
-        g_mutex_unlock(&cur_cb_name_mtx);
+        g_mutex_unlock(cur_cb_name_mtx);
         if (cb && cb_name) {
             cb(RA_REGISTER, cb_name, cb_data);
             called_back = TRUE;
@@ -87,9 +94,9 @@ register_all_protocol_handoffs(register_cb cb, gpointer cb_data)
 
     raphw_thread = g_thread_new("register_all_protocol_handoffs_worker", &register_all_protocol_handoffs_worker, NULL);
     while (!g_async_queue_timeout_pop(register_cb_done_q, CB_WAIT_TIME)) {
-        g_mutex_lock(&cur_cb_name_mtx);
+        g_mutex_lock(cur_cb_name_mtx);
         cb_name = cur_cb_name;
-        g_mutex_unlock(&cur_cb_name_mtx);
+        g_mutex_unlock(cur_cb_name_mtx);
         if (cb && cb_name) {
             cb(RA_HANDOFF, cb_name, cb_data);
             called_back = TRUE;
@@ -100,6 +107,13 @@ register_all_protocol_handoffs(register_cb cb, gpointer cb_data)
             cb(RA_HANDOFF, "Registration finished", cb_data);
     }
     g_async_queue_unref(register_cb_done_q);
+
+#if GLIB_CHECK_VERSION(2,32,0)
+    g_free(cur_cb_name_mtx);
+#else
+    g_mutex_free(cur_cb_name_mtx);
+#endif
+    cur_cb_name_mtx = NULL;
 }
 
 gulong register_count(void)