gthread: avoid locking in _get_mutex_impl
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 16 Sep 2009 15:39:48 +0000 (17:39 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 4 Jun 2011 01:42:51 +0000 (21:42 -0400)
When getting the mutex implementation of a static mutex, avoid taking the global
lock every time but only take the lock when there was no mutex and we need to
create one.

https://bugzilla.gnome.org/show_bug.cgi?id=599954

glib/gthread.c

index cefe88f..44075b6 100644 (file)
@@ -1267,19 +1267,30 @@ g_static_mutex_init (GStaticMutex *mutex)
 GMutex *
 g_static_mutex_get_mutex_impl (GMutex** mutex)
 {
+  GMutex *result;
+
   if (!g_thread_supported ())
     return NULL;
 
-  g_assert (g_once_mutex);
+  result = g_atomic_pointer_get (mutex);
 
-  g_mutex_lock (g_once_mutex);
+  if (!result)
+    {
+      g_assert (g_once_mutex);
 
-  if (!(*mutex))
-    g_atomic_pointer_set (mutex, g_mutex_new());
+      g_mutex_lock (g_once_mutex);
 
-  g_mutex_unlock (g_once_mutex);
+      result = *mutex;
+      if (!result)
+        {
+          result = g_mutex_new ();
+          g_atomic_pointer_set (mutex, result);
+        }
+
+      g_mutex_unlock (g_once_mutex);
+    }
 
-  return *mutex;
+  return result;
 }
 
 /* IMPLEMENTATION NOTE: