diff --git a/glib/gmessages.c b/glib/gmessages.c index 6598d1b1f..c4f844556 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 fad50605c..f552d4598 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 e85a719ea..237b8cb35 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 81fd7de36..79105898f 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 517f2053a..64522ae2e 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 77afc4e23..e9d5ebed1 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 4b9c2f491..05a91cfa3 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