[glib] gthread: avoid locking in _get_mutex_impl
- From: Matthias Clasen <matthiasc src gnome org>
 
- To: commits-list gnome org
 
- Cc: 
 
- Subject: [glib] gthread: avoid locking in _get_mutex_impl
 
- Date: Sat,  4 Jun 2011 01:43:14 +0000 (UTC)
 
commit 496157ffd3350799198e32e1002a19fc8be3ea83
Author: Wim Taymans <wim taymans collabora co uk>
Date:   Wed Sep 16 17:39:48 2009 +0200
    gthread: avoid locking in _get_mutex_impl
    
    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 |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)
---
diff --git a/glib/gthread.c b/glib/gthread.c
index cefe88f..44075b6 100644
--- a/glib/gthread.c
+++ b/glib/gthread.c
@@ -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:
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]