[glib] Continue GPrivate rework
- From: Ryan Lortie <ryanl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Continue GPrivate rework
- Date: Wed, 21 Sep 2011 20:18:52 +0000 (UTC)
commit 90679997ec7439ae520c97eb37b5ae36e0da6bba
Author: Ryan Lortie <desrt desrt ca>
Date: Sun Sep 18 01:10:07 2011 -0400
Continue GPrivate rework
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 | 10 +++++-----
glib/gslice.c | 8 ++++----
glib/gthread-posix.c | 18 ++++++++++++++----
glib/gthread-win32.c | 17 ++++++++++++++---
glib/gthread.c | 12 ++++++------
glib/gthread.h | 14 +++-----------
glib/gthreadprivate.h | 2 ++
7 files changed, 48 insertions(+), 33 deletions(-)
---
diff --git a/glib/gmessages.c b/glib/gmessages.c
index 6598d1b..c4f8445 100644
--- a/glib/gmessages.c
+++ b/glib/gmessages.c
@@ -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 ();
}
diff --git a/glib/gslice.c b/glib/gslice.c
index fad5060..f552d45 100644
--- a/glib/gslice.c
+++ b/glib/gslice.c
@@ -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.
*/
diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c
index e85a719..237b8cb 100644
--- a/glib/gthread-posix.c
+++ b/glib/gthread-posix.c
@@ -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");
}
diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c
index 81fd7de..7910589 100644
--- a/glib/gthread-win32.c
+++ b/glib/gthread-win32.c
@@ -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);
}
diff --git a/glib/gthread.c b/glib/gthread.c
index 517f205..64522ae 100644
--- a/glib/gthread.c
+++ b/glib/gthread.c
@@ -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;
diff --git a/glib/gthread.h b/glib/gthread.h
index 77afc4e..e9d5ebe 100644
--- a/glib/gthread.h
+++ b/glib/gthread.h
@@ -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
diff --git a/glib/gthreadprivate.h b/glib/gthreadprivate.h
index 4b9c2f4..05a91cf 100644
--- a/glib/gthreadprivate.h
+++ b/glib/gthreadprivate.h
@@ -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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]