[glib: 1/2] gmain: use atomic operation instead of GMutex to access g_main_context_default()



commit 39dd2be5386e8e5fa9492cc7f42e658ef18a6960
Author: Thomas Haller <thaller redhat com>
Date:   Mon Oct 7 13:22:30 2019 +0000

    gmain: use atomic operation instead of GMutex to access g_main_context_default()
    
    I think it is wasteful to use a mutex every time the default main context
    is accessed. Especially, as the default main context is used all the
    time.

 glib/gmain.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)
---
diff --git a/glib/gmain.c b/glib/gmain.c
index ae86d5a2c..27a30f202 100644
--- a/glib/gmain.c
+++ b/glib/gmain.c
@@ -439,9 +439,6 @@ static void block_source (GSource *source);
 
 static GMainContext *glib_worker_context;
 
-G_LOCK_DEFINE_STATIC (main_loop);
-static GMainContext *default_main_context;
-
 #ifndef G_OS_WIN32
 
 
@@ -667,34 +664,35 @@ g_main_context_new (void)
 
 /**
  * g_main_context_default:
- * 
+ *
  * Returns the global default main context. This is the main context
  * used for main loop functions when a main loop is not explicitly
  * specified, and corresponds to the "main" main loop. See also
  * g_main_context_get_thread_default().
- * 
+ *
  * Returns: (transfer none): the global default main context.
  **/
 GMainContext *
 g_main_context_default (void)
 {
-  /* Slow, but safe */
-  
-  G_LOCK (main_loop);
+  static GMainContext *default_main_context;
 
-  if (!default_main_context)
+  if (g_once_init_enter (&default_main_context))
     {
-      default_main_context = g_main_context_new ();
+      GMainContext *context;
+
+      context = g_main_context_new ();
 
-      TRACE (GLIB_MAIN_CONTEXT_DEFAULT (default_main_context));
+      TRACE (GLIB_MAIN_CONTEXT_DEFAULT (context));
 
 #ifdef G_MAIN_POLL_DEBUG
       if (_g_main_poll_debug)
-       g_print ("default context=%p\n", default_main_context);
+        g_print ("default context=%p\n", context);
 #endif
-    }
 
-  G_UNLOCK (main_loop);
+      g_once_init_leave ((gsize *) &default_main_context, (gsize) context);
+
+    }
 
   return default_main_context;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]