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 GLogLevelFlags g_log_always_fatal = G_LOG_FATAL_MASK;
|
||||||
static GPrintFunc glib_print_func = NULL;
|
static GPrintFunc glib_print_func = NULL;
|
||||||
static GPrintFunc glib_printerr_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 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 GLogFunc default_log_func = g_log_default_handler;
|
||||||
static gpointer default_log_data = NULL;
|
static gpointer default_log_data = NULL;
|
||||||
@ -512,7 +512,7 @@ g_logv (const gchar *log_domain,
|
|||||||
test_level = 1 << i;
|
test_level = 1 << i;
|
||||||
if (log_level & test_level)
|
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;
|
GLogDomain *domain;
|
||||||
GLogFunc log_func;
|
GLogFunc log_func;
|
||||||
GLogLevelFlags domain_fatal_mask;
|
GLogLevelFlags domain_fatal_mask;
|
||||||
@ -540,7 +540,7 @@ g_logv (const gchar *log_domain,
|
|||||||
domain = NULL;
|
domain = NULL;
|
||||||
g_mutex_unlock (&g_messages_lock);
|
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 */
|
/* had to defer debug initialization until we can keep track of recursion */
|
||||||
if (!(test_level & G_LOG_FLAG_RECURSION) && !g_debug_initialized)
|
if (!(test_level & G_LOG_FLAG_RECURSION) && !g_debug_initialized)
|
||||||
@ -617,7 +617,7 @@ g_logv (const gchar *log_domain,
|
|||||||
}
|
}
|
||||||
|
|
||||||
depth--;
|
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
|
void
|
||||||
_g_messages_thread_init_nomessage (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_messages_prefixed_init ();
|
||||||
g_debug_init ();
|
g_debug_init ();
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ static int smc_notify_free (void *pointer,
|
|||||||
size_t size);
|
size_t size);
|
||||||
|
|
||||||
/* --- variables --- */
|
/* --- variables --- */
|
||||||
static GPrivate *private_thread_memory = NULL;
|
static GPrivate private_thread_memory;
|
||||||
static gsize sys_page_size = 0;
|
static gsize sys_page_size = 0;
|
||||||
static Allocator allocator[1] = { { 0, }, };
|
static Allocator allocator[1] = { { 0, }, };
|
||||||
static SliceConfig slice_config = {
|
static SliceConfig slice_config = {
|
||||||
@ -398,7 +398,7 @@ _g_slice_thread_init_nomessage (void)
|
|||||||
* to a g_slice_alloc1() before g_thread_init().
|
* 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
|
static inline void
|
||||||
@ -434,7 +434,7 @@ g_mutex_lock_a (GMutex *mutex,
|
|||||||
static inline ThreadMemory*
|
static inline ThreadMemory*
|
||||||
thread_memory_from_self (void)
|
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))
|
if (G_UNLIKELY (!tmem))
|
||||||
{
|
{
|
||||||
static ThreadMemory *single_thread_memory = NULL; /* remember single-thread info for multi-threaded case */
|
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
|
* threaded case. but not *across* g_thread_init(), after multi-thread
|
||||||
* initialization it returns NULL for previously set single-thread data.
|
* 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
|
/* save single-thread thread memory structure, in case we need to
|
||||||
* pick it up again after multi-thread initialization happened.
|
* pick it up again after multi-thread initialization happened.
|
||||||
*/
|
*/
|
||||||
|
@ -207,7 +207,7 @@ g_cond_timedwait (GCond *cond,
|
|||||||
/* {{{1 GPrivate */
|
/* {{{1 GPrivate */
|
||||||
|
|
||||||
GPrivate *
|
GPrivate *
|
||||||
(g_private_new) (GDestroyNotify notify)
|
g_private_new (GDestroyNotify notify)
|
||||||
{
|
{
|
||||||
GPrivate *key;
|
GPrivate *key;
|
||||||
|
|
||||||
@ -224,21 +224,31 @@ g_private_init (GPrivate *key,
|
|||||||
GDestroyNotify notify)
|
GDestroyNotify notify)
|
||||||
{
|
{
|
||||||
pthread_key_create (&key->key, notify);
|
pthread_key_create (&key->key, notify);
|
||||||
|
key->ready = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpointer
|
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(). */
|
/* quote POSIX: No errors are returned from pthread_getspecific(). */
|
||||||
return pthread_getspecific (key->key);
|
return pthread_getspecific (key->key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
(g_private_set) (GPrivate *key,
|
g_private_set (GPrivate *key,
|
||||||
gpointer value)
|
gpointer value)
|
||||||
{
|
{
|
||||||
gint status;
|
gint status;
|
||||||
|
|
||||||
|
if (!key->ready)
|
||||||
|
{
|
||||||
|
key->single_value = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if G_UNLIKELY ((status = pthread_setspecific (key->key, value)) != 0)
|
if G_UNLIKELY ((status = pthread_setspecific (key->key, value)) != 0)
|
||||||
g_thread_abort (status, "pthread_setspecific");
|
g_thread_abort (status, "pthread_setspecific");
|
||||||
}
|
}
|
||||||
|
@ -246,7 +246,7 @@ struct _GPrivateDestructor
|
|||||||
static GPrivateDestructor * volatile g_private_destructors;
|
static GPrivateDestructor * volatile g_private_destructors;
|
||||||
|
|
||||||
GPrivate *
|
GPrivate *
|
||||||
(g_private_new) (GDestroyNotify notify)
|
g_private_new (GDestroyNotify notify)
|
||||||
{
|
{
|
||||||
GPrivate *key;
|
GPrivate *key;
|
||||||
|
|
||||||
@ -275,18 +275,29 @@ g_private_init (GPrivate *key,
|
|||||||
do
|
do
|
||||||
destructor->next = g_private_destructors;
|
destructor->next = g_private_destructors;
|
||||||
while (InterlockedCompareExchangePointer (&g_private_destructors, destructor->next, destructor) != destructor->next);
|
while (InterlockedCompareExchangePointer (&g_private_destructors, destructor->next, destructor) != destructor->next);
|
||||||
|
|
||||||
|
key->ready = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpointer
|
gpointer
|
||||||
(g_private_get) (GPrivate *key)
|
g_private_get (GPrivate *key)
|
||||||
{
|
{
|
||||||
|
if (!key->ready)
|
||||||
|
return key->single_value;
|
||||||
|
|
||||||
return TlsGetValue (key->index);
|
return TlsGetValue (key->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
(g_private_set) (GPrivate *key,
|
g_private_set (GPrivate *key,
|
||||||
gpointer value)
|
gpointer value)
|
||||||
{
|
{
|
||||||
|
if (!key->ready)
|
||||||
|
{
|
||||||
|
key->single_value = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
TlsSetValue (key->index, value);
|
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 GMutex g_once_mutex = G_MUTEX_INIT;
|
||||||
static GCond g_once_cond = G_COND_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 GRealThread *g_thread_all_threads = NULL;
|
||||||
static GSList *g_thread_free_indices = NULL;
|
static GSList *g_thread_free_indices = NULL;
|
||||||
static GSList* g_once_init_list = NULL;
|
static GSList* g_once_init_list = NULL;
|
||||||
@ -945,8 +945,8 @@ g_thread_init_glib (void)
|
|||||||
|
|
||||||
/* setup the basic threading system */
|
/* setup the basic threading system */
|
||||||
g_threads_got_initialized = TRUE;
|
g_threads_got_initialized = TRUE;
|
||||||
g_thread_specific_private = g_private_new (g_thread_cleanup);
|
g_private_init (&g_thread_specific_private, g_thread_cleanup);
|
||||||
g_private_set (g_thread_specific_private, main_thread);
|
g_private_set (&g_thread_specific_private, main_thread);
|
||||||
G_THREAD_UF (thread_self, (&main_thread->system_thread));
|
G_THREAD_UF (thread_self, (&main_thread->system_thread));
|
||||||
|
|
||||||
/* complete memory system initialization, g_private_*() works now */
|
/* complete memory system initialization, g_private_*() works now */
|
||||||
@ -1924,7 +1924,7 @@ g_thread_create_proxy (gpointer data)
|
|||||||
g_assert (data);
|
g_assert (data);
|
||||||
|
|
||||||
/* This has to happen before G_LOCK, as that might call g_thread_self */
|
/* 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,
|
/* the lock makes sure, that thread->system_thread is written,
|
||||||
before thread->thread.func is called. See g_thread_create. */
|
before thread->thread.func is called. See g_thread_create. */
|
||||||
@ -2147,7 +2147,7 @@ g_thread_set_priority (GThread* thread,
|
|||||||
GThread*
|
GThread*
|
||||||
g_thread_self (void)
|
g_thread_self (void)
|
||||||
{
|
{
|
||||||
GRealThread* thread = g_private_get (g_thread_specific_private);
|
GRealThread* thread = g_private_get (&g_thread_specific_private);
|
||||||
|
|
||||||
if (!thread)
|
if (!thread)
|
||||||
{
|
{
|
||||||
@ -2165,7 +2165,7 @@ g_thread_self (void)
|
|||||||
if (g_thread_supported ())
|
if (g_thread_supported ())
|
||||||
G_THREAD_UF (thread_self, (&thread->system_thread));
|
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);
|
G_LOCK (g_thread);
|
||||||
thread->next = g_thread_all_threads;
|
thread->next = g_thread_all_threads;
|
||||||
|
@ -187,14 +187,6 @@ GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex);
|
|||||||
#else
|
#else
|
||||||
#define g_thread_supported() (g_threads_got_initialized)
|
#define g_thread_supported() (g_threads_got_initialized)
|
||||||
#endif
|
#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_yield() G_THREAD_CF (thread_yield, (void)0, ())
|
||||||
|
|
||||||
#define g_thread_create(func, data, joinable, error) \
|
#define g_thread_create(func, data, joinable, error) \
|
||||||
@ -408,9 +400,9 @@ void g_mutex_free (GMutex
|
|||||||
GCond * g_cond_new (void);
|
GCond * g_cond_new (void);
|
||||||
void g_cond_free (GCond *cond);
|
void g_cond_free (GCond *cond);
|
||||||
|
|
||||||
GPrivate * (g_private_new) (GDestroyNotify notify);
|
GPrivate * g_private_new (GDestroyNotify notify);
|
||||||
gpointer (g_private_get) (GPrivate *key);
|
gpointer g_private_get (GPrivate *key);
|
||||||
void (g_private_set) (GPrivate *key,
|
void g_private_set (GPrivate *key,
|
||||||
gpointer value);
|
gpointer value);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
@ -57,6 +57,8 @@ G_GNUC_INTERNAL void _g_thread_impl_init (void);
|
|||||||
|
|
||||||
struct _GPrivate
|
struct _GPrivate
|
||||||
{
|
{
|
||||||
|
gpointer single_value;
|
||||||
|
gboolean ready;
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
gint index;
|
gint index;
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user