mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-11 03:46:17 +01:00
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.
This commit is contained in:
parent
b0d83576e2
commit
90679997ec
@ -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 ();
|
||||
}
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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,
|
||||
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");
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user