Mercurial > hg > mxe
view src/glib-6-static-init.patch @ 2615:7e5aaa010a02
update package glib
author | Hans Petter Jansson <hpj@cl.no> |
---|---|
date | Mon, 04 Jun 2012 18:02:11 +0200 |
parents | |
children |
line wrap: on
line source
This file is part of MXE. See index.html for further information. Ensure globals are initialized even when DllMain is not being run. diff --git a/glib/gmain.c b/glib/gmain.c index 760f179..878ac14 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -1981,12 +1981,15 @@ g_get_real_time (void) #ifdef G_OS_WIN32 static ULONGLONG (*g_GetTickCount64) (void) = NULL; static guint32 g_win32_tick_epoch = 0; +static gboolean g_win32_clock_is_initialized; G_GNUC_INTERNAL void g_clock_win32_init (void) { HMODULE kernel32; + g_win32_clock_is_initialized = TRUE; + g_GetTickCount64 = NULL; kernel32 = GetModuleHandle ("KERNEL32.DLL"); if (kernel32 != NULL) @@ -2105,6 +2108,9 @@ g_get_monotonic_time (void) * timeBeginPeriod() to increase it as much as they want */ + if (!g_win32_clock_is_initialized) + g_clock_win32_init (); + if (g_GetTickCount64 != NULL) { guint32 ticks_as_32bit; diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c index 5a9ac97..e4d1d48 100644 --- a/glib/gthread-win32.c +++ b/glib/gthread-win32.c @@ -117,18 +117,28 @@ typedef struct void (__stdcall * WakeConditionVariable) (gpointer cond); } GThreadImplVtable; +/* Needed for static builds where DllMain initializer doesn't get called */ +static gboolean g_threads_is_initialized; +G_GNUC_INTERNAL void g_thread_win32_init (void); + static GThreadImplVtable g_thread_impl_vtable; /* {{{1 GMutex */ void g_mutex_init (GMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.InitializeSRWLock (mutex); } void g_mutex_clear (GMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + if (g_thread_impl_vtable.DeleteSRWLock != NULL) g_thread_impl_vtable.DeleteSRWLock (mutex); } @@ -136,18 +146,27 @@ g_mutex_clear (GMutex *mutex) void g_mutex_lock (GMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.AcquireSRWLockExclusive (mutex); } gboolean g_mutex_trylock (GMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + return g_thread_impl_vtable.TryAcquireSRWLockExclusive (mutex); } void g_mutex_unlock (GMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.ReleaseSRWLockExclusive (mutex); } @@ -158,6 +177,9 @@ g_rec_mutex_impl_new (void) { CRITICAL_SECTION *cs; + if (!g_threads_is_initialized) + g_thread_win32_init (); + cs = g_slice_new (CRITICAL_SECTION); InitializeCriticalSection (cs); @@ -168,6 +190,10 @@ static void g_rec_mutex_impl_free (CRITICAL_SECTION *cs) { DeleteCriticalSection (cs); + + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_slice_free (CRITICAL_SECTION, cs); } @@ -176,6 +202,9 @@ g_rec_mutex_get_impl (GRecMutex *mutex) { CRITICAL_SECTION *impl = mutex->p; + if (!g_threads_is_initialized) + g_thread_win32_init (); + if G_UNLIKELY (mutex->p == NULL) { impl = g_rec_mutex_impl_new (); @@ -190,30 +219,45 @@ g_rec_mutex_get_impl (GRecMutex *mutex) void g_rec_mutex_init (GRecMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + mutex->p = g_rec_mutex_impl_new (); } void g_rec_mutex_clear (GRecMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_rec_mutex_impl_free (mutex->p); } void g_rec_mutex_lock (GRecMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + EnterCriticalSection (g_rec_mutex_get_impl (mutex)); } void g_rec_mutex_unlock (GRecMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + LeaveCriticalSection (mutex->p); } gboolean g_rec_mutex_trylock (GRecMutex *mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + return TryEnterCriticalSection (g_rec_mutex_get_impl (mutex)); } @@ -222,12 +266,18 @@ g_rec_mutex_trylock (GRecMutex *mutex) void g_rw_lock_init (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.InitializeSRWLock (lock); } void g_rw_lock_clear (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + if (g_thread_impl_vtable.DeleteSRWLock != NULL) g_thread_impl_vtable.DeleteSRWLock (lock); } @@ -235,36 +285,54 @@ g_rw_lock_clear (GRWLock *lock) void g_rw_lock_writer_lock (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.AcquireSRWLockExclusive (lock); } gboolean g_rw_lock_writer_trylock (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + return g_thread_impl_vtable.TryAcquireSRWLockExclusive (lock); } void g_rw_lock_writer_unlock (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.ReleaseSRWLockExclusive (lock); } void g_rw_lock_reader_lock (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.AcquireSRWLockShared (lock); } gboolean g_rw_lock_reader_trylock (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + return g_thread_impl_vtable.TryAcquireSRWLockShared (lock); } void g_rw_lock_reader_unlock (GRWLock *lock) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.ReleaseSRWLockShared (lock); } @@ -272,12 +340,18 @@ g_rw_lock_reader_unlock (GRWLock *lock) void g_cond_init (GCond *cond) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.InitializeConditionVariable (cond); } void g_cond_clear (GCond *cond) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + if (g_thread_impl_vtable.DeleteConditionVariable) g_thread_impl_vtable.DeleteConditionVariable (cond); } @@ -285,12 +359,18 @@ g_cond_clear (GCond *cond) void g_cond_signal (GCond *cond) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.WakeConditionVariable (cond); } void g_cond_broadcast (GCond *cond) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.WakeAllConditionVariable (cond); } @@ -298,6 +378,9 @@ void g_cond_wait (GCond *cond, GMutex *entered_mutex) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + g_thread_impl_vtable.SleepConditionVariableSRW (cond, entered_mutex, INFINITE, 0); } @@ -308,6 +391,9 @@ g_cond_wait_until (GCond *cond, { gint64 span; + if (!g_threads_is_initialized) + g_thread_win32_init (); + span = end_time - g_get_monotonic_time (); if G_UNLIKELY (span < 0) @@ -340,6 +426,9 @@ g_private_get_impl (GPrivate *key) if G_UNLIKELY (impl == 0) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + EnterCriticalSection (&g_private_lock); impl = (DWORD) key->p; if (impl == 0) @@ -433,6 +522,9 @@ g_system_thread_free (GRealThread *thread) { GThreadWin32 *wt = (GThreadWin32 *) thread; + if (!g_threads_is_initialized) + g_thread_win32_init (); + win32_check_for_error (CloseHandle (wt->handle)); g_slice_free (GThreadWin32, wt); } @@ -440,6 +532,9 @@ g_system_thread_free (GRealThread *thread) void g_system_thread_exit (void) { + if (!g_threads_is_initialized) + g_thread_win32_init (); + _endthreadex (0); } @@ -448,6 +543,9 @@ g_thread_win32_proxy (gpointer data) { GThreadWin32 *self = data; + if (!g_threads_is_initialized) + g_thread_win32_init (); + self->proxy (self); g_system_thread_exit (); @@ -465,6 +563,9 @@ g_system_thread_new (GThreadFunc func, GThreadWin32 *thread; guint ignore; + if (!g_threads_is_initialized) + g_thread_win32_init (); + thread = g_slice_new0 (GThreadWin32); thread->proxy = func; @@ -494,6 +595,9 @@ g_system_thread_wait (GRealThread *thread) { GThreadWin32 *wt = (GThreadWin32 *) thread; + if (!g_threads_is_initialized) + g_thread_win32_init (); + win32_check_for_error (WAIT_FAILED != WaitForSingleObject (wt->handle, INFINITE)); } @@ -985,6 +1089,8 @@ g_thread_lookup_native_funcs (void) G_GNUC_INTERNAL void g_thread_win32_init (void) { + g_threads_is_initialized = TRUE; + if (!g_thread_lookup_native_funcs ()) g_thread_xp_init ();