commit:     bb08a88c4e2db3ea1c713b3de987c3bed4229c54
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Thu Feb 25 10:15:35 2016 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Thu Feb 25 10:15:35 2016 +0000
URL:        https://gitweb.gentoo.org/proj/grs.git/commit/?id=bb08a88c

patch: fix dev-libs/glib-2.46.2-r1, bug #575614

 .../patches/dev-libs/glib/glib-fix-ctors.patch     | 112 +++++++++++++++++++++
 1 file changed, 112 insertions(+)

diff --git a/core/etc/portage/patches/dev-libs/glib/glib-fix-ctors.patch 
b/core/etc/portage/patches/dev-libs/glib/glib-fix-ctors.patch
new file mode 100644
index 0000000..ece936a
--- /dev/null
+++ b/core/etc/portage/patches/dev-libs/glib/glib-fix-ctors.patch
@@ -0,0 +1,112 @@
+See: https://bugs.gentoo.org/show_bug.cgi?id=575614
+
+From ca32c60a815f91a28e63993e9b53a2cfa0764240 Mon Sep 17 00:00:00 2001
+From: Natanael Copa <[email protected]>
+Date: Fri, 2 Oct 2015 08:11:53 +0200
+Subject: [PATCH] Revert "Move quark initialization to a constructor"
+
+musl's does not run ctors in the assumed order that glib-2.46 expects:
+
+- glib_init() should be called before gobject_init_ctor().
+
+This reverts commit 2fe992b099bfd3fb121a71b7af43e116b2142b5d.
+---
+ glib/glib-init.c |  1 -
+ glib/glib-init.h |  2 --
+ glib/gquark.c    | 26 ++++++++++++--------------
+ 3 files changed, 12 insertions(+), 17 deletions(-)
+
+diff --git a/glib/glib-init.c b/glib/glib-init.c
+index e7002e6..24efe9d 100644
+--- a/glib/glib-init.c
++++ b/glib/glib-init.c
+@@ -233,7 +233,6 @@ glib_init (void)
+ {
+   g_messages_prefixed_init ();
+   g_debug_init ();
+-  g_quark_init ();
+ }
+ 
+ #if defined (G_OS_WIN32)
+diff --git a/glib/glib-init.h b/glib/glib-init.h
+index b56f7e2..de6be78 100644
+--- a/glib/glib-init.h
++++ b/glib/glib-init.h
+@@ -25,8 +25,6 @@
+ extern GLogLevelFlags g_log_always_fatal;
+ extern GLogLevelFlags g_log_msg_prefix;
+ 
+-void g_quark_init (void);
+-
+ #ifdef G_OS_WIN32
+ #include <windows.h>
+ 
+diff --git a/glib/gquark.c b/glib/gquark.c
+index 9e51a92..d620533 100644
+--- a/glib/gquark.c
++++ b/glib/gquark.c
+@@ -40,7 +40,6 @@
+ #include "gthread.h"
+ #include "gtestutils.h"
+ #include "glib_trace.h"
+-#include "glib-init.h"
+ 
+ #define QUARK_BLOCK_SIZE         2048
+ #define QUARK_STRING_BLOCK_SIZE (4096 - sizeof (gsize))
+@@ -54,16 +53,6 @@ static gint           quark_seq_id = 0;
+ static gchar         *quark_block = NULL;
+ static gint           quark_block_offset = 0;
+ 
+-void
+-g_quark_init (void)
+-{
+-  g_assert (quark_seq_id == 0);
+-  quark_ht = g_hash_table_new (g_str_hash, g_str_equal);
+-  quarks = g_new (gchar*, QUARK_BLOCK_SIZE);
+-  quarks[0] = NULL;
+-  quark_seq_id = 1;
+-}
+-
+ /**
+  * SECTION:quarks
+  * @title: Quarks
+@@ -138,9 +127,10 @@ g_quark_try_string (const gchar *string)
+     return 0;
+ 
+   G_LOCK (quark_global);
+-  quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string));
++  if (quark_ht)
++    quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string));
+   G_UNLOCK (quark_global);
+-
++  
+   return quark;
+ }
+ 
+@@ -179,7 +169,8 @@ quark_from_string (const gchar *string,
+ {
+   GQuark quark = 0;
+ 
+-  quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string));
++  if (quark_ht)
++    quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string));
+ 
+   if (!quark)
+     {
+@@ -292,6 +283,13 @@ quark_new (gchar *string)
+        */
+       g_atomic_pointer_set (&quarks, quarks_new);
+     }
++  if (!quark_ht)
++    {
++      g_assert (quark_seq_id == 0);
++      quark_ht = g_hash_table_new (g_str_hash, g_str_equal);
++      quarks[quark_seq_id] = NULL;
++      g_atomic_int_inc (&quark_seq_id);
++    }
+ 
+   quark = quark_seq_id;
+   g_atomic_pointer_set (&quarks[quark], string);
+-- 
+2.6.0
+

Reply via email to