Continue GPrivate rework
authorRyan Lortie <desrt@desrt.ca>
Sun, 18 Sep 2011 05:10:07 +0000 (01:10 -0400)
committerRyan Lortie <desrt@desrt.ca>
Wed, 21 Sep 2011 20:06:53 +0000 (16:06 -0400)
We remove the macros while at the same time switching all libglib users
from g_private_new() to g_private_init().  We deal with the strange
expectations of the libglib code that g_private_* should work before the
GPrivate has been initialised with a temporary shim.

glib/gmessages.c
glib/gslice.c
glib/gthread-posix.c
glib/gthread-win32.c
glib/gthread.c
glib/gthread.h
glib/gthreadprivate.h

index 6598d1b..c4f8445 100644 (file)
@@ -107,7 +107,7 @@ static GLogDomain    *g_log_domains = NULL;
 static GLogLevelFlags g_log_always_fatal = G_LOG_FATAL_MASK;
 static GPrintFunc     glib_print_func = NULL;
 static GPrintFunc     glib_printerr_func = NULL;
-static GPrivate             *g_log_depth = NULL;
+static GPrivate       g_log_depth;
 static GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG;
 static GLogFunc       default_log_func = g_log_default_handler;
 static gpointer       default_log_data = NULL;
@@ -512,7 +512,7 @@ g_logv (const gchar   *log_domain,
       test_level = 1 << i;
       if (log_level & test_level)
        {
-         guint depth = GPOINTER_TO_UINT (g_private_get (g_log_depth));
+         guint depth = GPOINTER_TO_UINT (g_private_get (&g_log_depth));
          GLogDomain *domain;
          GLogFunc log_func;
          GLogLevelFlags domain_fatal_mask;
@@ -540,7 +540,7 @@ g_logv (const gchar   *log_domain,
          domain = NULL;
          g_mutex_unlock (&g_messages_lock);
 
-         g_private_set (g_log_depth, GUINT_TO_POINTER (depth));
+         g_private_set (&g_log_depth, GUINT_TO_POINTER (depth));
 
          /* had to defer debug initialization until we can keep track of recursion */
          if (!(test_level & G_LOG_FLAG_RECURSION) && !g_debug_initialized)
@@ -617,7 +617,7 @@ g_logv (const gchar   *log_domain,
            }
          
          depth--;
-         g_private_set (g_log_depth, GUINT_TO_POINTER (depth));
+         g_private_set (&g_log_depth, GUINT_TO_POINTER (depth));
        }
     }
 }
@@ -1214,7 +1214,7 @@ g_printf_string_upper_bound (const gchar *format,
 void
 _g_messages_thread_init_nomessage (void)
 {
-  g_log_depth = g_private_new (NULL);
+  g_private_init (&g_log_depth, NULL);
   g_messages_prefixed_init ();
   g_debug_init ();
 }
index fad5060..f552d45 100644 (file)
@@ -202,7 +202,7 @@ static int      smc_notify_free   (void   *pointer,
                                    size_t  size);
 
 /* --- variables --- */
-static GPrivate   *private_thread_memory = NULL;
+static GPrivate    private_thread_memory;
 static gsize       sys_page_size = 0;
 static Allocator   allocator[1] = { { 0, }, };
 static SliceConfig slice_config = {
@@ -398,7 +398,7 @@ _g_slice_thread_init_nomessage (void)
        * to a g_slice_alloc1() before g_thread_init().
        */
     }
-  private_thread_memory = g_private_new (private_thread_memory_cleanup);
+  g_private_init (&private_thread_memory, private_thread_memory_cleanup);
 }
 
 static inline void
@@ -434,7 +434,7 @@ g_mutex_lock_a (GMutex *mutex,
 static inline ThreadMemory*
 thread_memory_from_self (void)
 {
-  ThreadMemory *tmem = g_private_get (private_thread_memory);
+  ThreadMemory *tmem = g_private_get (&private_thread_memory);
   if (G_UNLIKELY (!tmem))
     {
       static ThreadMemory *single_thread_memory = NULL;   /* remember single-thread info for multi-threaded case */
@@ -463,7 +463,7 @@ thread_memory_from_self (void)
        * threaded case. but not *across* g_thread_init(), after multi-thread
        * initialization it returns NULL for previously set single-thread data.
        */
-      g_private_set (private_thread_memory, tmem);
+      g_private_set (&private_thread_memory, tmem);
       /* save single-thread thread memory structure, in case we need to
        * pick it up again after multi-thread initialization happened.
        */
index e85a719..237b8cb 100644 (file)
@@ -207,7 +207,7 @@ g_cond_timedwait (GCond  *cond,
 /* {{{1 GPrivate */
 
 GPrivate *
-(g_private_new) (GDestroyNotify notify)
+g_private_new (GDestroyNotify notify)
 {
   GPrivate *key;
 
@@ -224,21 +224,31 @@ g_private_init (GPrivate       *key,
                 GDestroyNotify  notify)
 {
   pthread_key_create (&key->key, notify);
+  key->ready = TRUE;
 }
 
 gpointer
-(g_private_get) (GPrivate *key)
+g_private_get (GPrivate *key)
 {
+  if (!key->ready)
+    return key->single_value;
+
   /* quote POSIX: No errors are returned from pthread_getspecific(). */
   return pthread_getspecific (key->key);
 }
 
 void
-(g_private_set) (GPrivate *key,
-                 gpointer  value)
+g_private_set (GPrivate *key,
+               gpointer  value)
 {
   gint status;
 
+  if (!key->ready)
+    {
+      key->single_value = value;
+      return;
+    }
+
   if G_UNLIKELY ((status = pthread_setspecific (key->key, value)) != 0)
     g_thread_abort (status, "pthread_setspecific");
 }
index 81fd7de..7910589 100644 (file)
@@ -246,7 +246,7 @@ struct _GPrivateDestructor
 static GPrivateDestructor * volatile g_private_destructors;
 
 GPrivate *
-(g_private_new) (GDestroyNotify notify)
+g_private_new (GDestroyNotify notify)
 {
   GPrivate *key;
 
@@ -275,18 +275,29 @@ g_private_init (GPrivate       *key,
   do
     destructor->next = g_private_destructors;
   while (InterlockedCompareExchangePointer (&g_private_destructors, destructor->next, destructor) != destructor->next);
+
+  key->ready = TRUE;
 }
 
 gpointer
-(g_private_get) (GPrivate *key)
+g_private_get (GPrivate *key)
 {
+  if (!key->ready)
+    return key->single_value;
+
   return TlsGetValue (key->index);
 }
 
 void
-(g_private_set) (GPrivate *key,
+g_private_set (GPrivate *key,
                gpointer  value)
 {
+  if (!key->ready)
+    {
+      key->single_value = value;
+      return;
+    }
+
   TlsSetValue (key->index, value);
 }
 
index 517f205..64522ae 100644 (file)
@@ -876,7 +876,7 @@ static GThreadFunctions g_thread_functions_for_glib_use_old = {
 
 static GMutex    g_once_mutex = G_MUTEX_INIT;
 static GCond     g_once_cond = G_COND_INIT;
-static GPrivate *g_thread_specific_private = NULL;
+static GPrivate  g_thread_specific_private;
 static GRealThread *g_thread_all_threads = NULL;
 static GSList   *g_thread_free_indices = NULL;
 static GSList*   g_once_init_list = NULL;
@@ -945,8 +945,8 @@ g_thread_init_glib (void)
 
   /* setup the basic threading system */
   g_threads_got_initialized = TRUE;
-  g_thread_specific_private = g_private_new (g_thread_cleanup);
-  g_private_set (g_thread_specific_private, main_thread);
+  g_private_init (&g_thread_specific_private, g_thread_cleanup);
+  g_private_set (&g_thread_specific_private, main_thread);
   G_THREAD_UF (thread_self, (&main_thread->system_thread));
 
   /* complete memory system initialization, g_private_*() works now */
@@ -1924,7 +1924,7 @@ g_thread_create_proxy (gpointer data)
   g_assert (data);
 
   /* This has to happen before G_LOCK, as that might call g_thread_self */
-  g_private_set (g_thread_specific_private, data);
+  g_private_set (&g_thread_specific_private, data);
 
   /* the lock makes sure, that thread->system_thread is written,
      before thread->thread.func is called. See g_thread_create. */
@@ -2147,7 +2147,7 @@ g_thread_set_priority (GThread* thread,
 GThread*
 g_thread_self (void)
 {
-  GRealThread* thread = g_private_get (g_thread_specific_private);
+  GRealThread* thread = g_private_get (&g_thread_specific_private);
 
   if (!thread)
     {
@@ -2165,7 +2165,7 @@ g_thread_self (void)
       if (g_thread_supported ())
        G_THREAD_UF (thread_self, (&thread->system_thread));
 
-      g_private_set (g_thread_specific_private, thread);
+      g_private_set (&g_thread_specific_private, thread);
 
       G_LOCK (g_thread);
       thread->next = g_thread_all_threads;
index 77afc4e..e9d5ebe 100644 (file)
@@ -187,14 +187,6 @@ GMutex* g_static_mutex_get_mutex_impl   (GMutex **mutex);
 #else
 #define g_thread_supported()    (g_threads_got_initialized)
 #endif
-#define g_private_new(destructor) G_THREAD_UF (private_new, (destructor))
-#define g_private_get(private_key) G_THREAD_CF (private_get, \
-                                                ((gpointer)private_key), \
-                                                (private_key))
-#define g_private_set(private_key, value) G_THREAD_CF (private_set, \
-                                                       (void) (private_key = \
-                                                        (GPrivate*) (value)), \
-                                                       (private_key, value))
 #define g_thread_yield()              G_THREAD_CF (thread_yield, (void)0, ())
 
 #define g_thread_create(func, data, joinable, error)                   \
@@ -408,9 +400,9 @@ void                    g_mutex_free                                    (GMutex
 GCond *                 g_cond_new                                      (void);
 void                    g_cond_free                                     (GCond          *cond);
 
-GPrivate *              (g_private_new)                                 (GDestroyNotify  notify);
-gpointer                (g_private_get)                                 (GPrivate       *key);
-void                    (g_private_set)                                 (GPrivate       *key,
+GPrivate *              g_private_new                                   (GDestroyNotify  notify);
+gpointer                g_private_get                                   (GPrivate       *key);
+void                    g_private_set                                   (GPrivate       *key,
                                                                          gpointer        value);
 
 G_END_DECLS
index 4b9c2f4..05a91cf 100644 (file)
@@ -57,6 +57,8 @@ G_GNUC_INTERNAL void _g_thread_impl_init  (void);
 
 struct _GPrivate
 {
+  gpointer single_value;
+  gboolean ready;
 #ifdef G_OS_WIN32
   gint index;
 #else