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 ();