X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fglib-init.c;h=24efe9dc1936d2aa831f4fae00e0b0718f4bbdfc;hb=2a53b4d0e2c98a14aedf31e38f0ad1fb2e8fe26f;hp=4879e0b229fb8717a26e1277885a5fd41e40c06a;hpb=f1512917e6e46e30000bcca2ebf06ef9d15b751d;p=platform%2Fupstream%2Fglib.git
diff --git a/glib/glib-init.c b/glib/glib-init.c
index 4879e0b..24efe9d 100644
--- a/glib/glib-init.c
+++ b/glib/glib-init.c
@@ -12,9 +12,7 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- * USA.
+ * License along with this library; if not, see .
*
* Author: Ryan Lortie
*/
@@ -23,18 +21,35 @@
#include "glib-init.h"
+#include "glib-private.h"
+#include "gtypes.h"
#include "gutils.h" /* for GDebugKey */
+#include "gconstructor.h"
+#include "gmem.h" /* for g_mem_gc_friendly */
#include
#include
#include
#include
+/* This seems as good a place as any to make static assertions about platform
+ * assumptions we make throughout GLib. */
+
+/* We do not support 36-bit bytes or other historical curiosities. */
+G_STATIC_ASSERT (CHAR_BIT == 8);
+
+/* We assume that data pointers are the same size as function pointers... */
+G_STATIC_ASSERT (sizeof (gpointer) == sizeof (GFunc));
+G_STATIC_ASSERT (_g_alignof (gpointer) == _g_alignof (GFunc));
+/* ... and that all function pointers are the same size. */
+G_STATIC_ASSERT (sizeof (GFunc) == sizeof (GCompareDataFunc));
+G_STATIC_ASSERT (_g_alignof (GFunc) == _g_alignof (GCompareDataFunc));
+
/**
* g_mem_gc_friendly:
*
- * This variable is %TRUE if the G_DEBUG environment variable
- * includes the key gc-friendly.
+ * This variable is %TRUE if the `G_DEBUG` environment variable
+ * includes the key `gc-friendly`.
*/
#ifdef ENABLE_GC_FRIENDLY_DEFAULT
gboolean g_mem_gc_friendly = TRUE;
@@ -69,16 +84,20 @@ debug_key_matches (const gchar *key,
* commas, or %NULL.
* @keys: (array length=nkeys): pointer to an array of #GDebugKey which associate
* strings with bit flags.
- * @nkeys: the number of #GDebugKeys in the array.
+ * @nkeys: the number of #GDebugKeys in the array.
*
* Parses a string containing debugging options
* into a %guint containing bit flags. This is used
* within GDK and GTK+ to parse the debug options passed on the
* command line or through environment variables.
*
- * If @string is equal to "all", all flags are set. If @string
- * is equal to "help", all the available keys in @keys are printed
- * out to standard error.
+ * If @string is equal to "all", all flags are set. Any flags
+ * specified along with "all" in @string are inverted; thus,
+ * "all,foo,bar" or "foo,bar,all" sets all flags except those
+ * corresponding to "foo" and "bar".
+ *
+ * If @string is equal to "help", all the available keys in @keys
+ * are printed out to standard error.
*
* Returns: the combined set of bit flags.
*/
@@ -101,38 +120,51 @@ g_parse_debug_string (const gchar *string,
* inside GLib.
*/
- if (!strcasecmp (string, "all"))
- {
- for (i = 0; i < nkeys; i++)
- result |= keys[i].value;
- }
- else if (!strcasecmp (string, "help"))
+ if (!strcasecmp (string, "help"))
{
/* using stdio directly for the reason stated above */
- fprintf (stderr, "Supported debug values: ");
+ fprintf (stderr, "Supported debug values:");
for (i = 0; i < nkeys; i++)
fprintf (stderr, " %s", keys[i].key);
- fprintf (stderr, "\n");
+ fprintf (stderr, " all help\n");
}
else
{
const gchar *p = string;
const gchar *q;
+ gboolean invert = FALSE;
while (*p)
{
q = strpbrk (p, ":;, \t");
if (!q)
- q = p + strlen(p);
-
- for (i = 0; i < nkeys; i++)
- if (debug_key_matches (keys[i].key, p, q - p))
- result |= keys[i].value;
+ q = p + strlen (p);
+
+ if (debug_key_matches ("all", p, q - p))
+ {
+ invert = TRUE;
+ }
+ else
+ {
+ for (i = 0; i < nkeys; i++)
+ if (debug_key_matches (keys[i].key, p, q - p))
+ result |= keys[i].value;
+ }
p = q;
if (*p)
p++;
}
+
+ if (invert)
+ {
+ guint all_flags = 0;
+
+ for (i = 0; i < nkeys; i++)
+ all_flags |= keys[i].value;
+
+ result = all_flags & (~result);
+ }
}
return result;
@@ -141,13 +173,14 @@ g_parse_debug_string (const gchar *string,
static guint
g_parse_debug_envvar (const gchar *envvar,
const GDebugKey *keys,
- gint n_keys)
+ gint n_keys,
+ guint default_value)
{
const gchar *value;
#ifdef OS_WIN32
/* "fatal-warnings,fatal-criticals,all,help" is pretty short */
- gchar buffer[80];
+ gchar buffer[100];
if (GetEnvironmentVariable (envvar, buffer, 100) < 100)
value = buffer;
@@ -157,6 +190,9 @@ g_parse_debug_envvar (const gchar *envvar,
value = getenv (envvar);
#endif
+ if (value == NULL)
+ return default_value;
+
return g_parse_debug_string (value, keys, n_keys);
}
@@ -172,32 +208,24 @@ g_messages_prefixed_init (void)
{ "debug", G_LOG_LEVEL_DEBUG }
};
- g_log_msg_prefix = g_parse_debug_envvar ("G_MESSAGES_PREFIXED", keys, G_N_ELEMENTS (keys));
+ g_log_msg_prefix = g_parse_debug_envvar ("G_MESSAGES_PREFIXED", keys, G_N_ELEMENTS (keys), g_log_msg_prefix);
}
static void
g_debug_init (void)
{
const GDebugKey keys[] = {
+ { "gc-friendly", 1 },
{"fatal-warnings", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL },
{"fatal-criticals", G_LOG_LEVEL_CRITICAL }
};
GLogLevelFlags flags;
- flags = g_parse_debug_envvar ("G_DEBUG", keys, G_N_ELEMENTS (keys));
+ flags = g_parse_debug_envvar ("G_DEBUG", keys, G_N_ELEMENTS (keys), 0);
- g_log_always_fatal |= flags;
-}
-
-static void
-g_mem_init (void)
-{
- const GDebugKey keys[] = {
- { "gc-friendly", 1 },
- };
+ g_log_always_fatal |= flags & G_LOG_LEVEL_MASK;
- if (g_parse_debug_envvar ("G_DEBUG", keys, G_N_ELEMENTS (keys)))
- g_mem_gc_friendly = TRUE;
+ g_mem_gc_friendly = flags & 1;
}
static void
@@ -205,11 +233,14 @@ glib_init (void)
{
g_messages_prefixed_init ();
g_debug_init ();
- g_mem_init ();
}
#if defined (G_OS_WIN32)
+BOOL WINAPI DllMain (HINSTANCE hinstDLL,
+ DWORD fdwReason,
+ LPVOID lpvReserved);
+
HMODULE glib_dll;
BOOL WINAPI
@@ -221,12 +252,17 @@ DllMain (HINSTANCE hinstDLL,
{
case DLL_PROCESS_ATTACH:
glib_dll = hinstDLL;
+ g_clock_win32_init ();
+#ifdef THREADS_WIN32
g_thread_win32_init ();
+#endif
glib_init ();
break;
case DLL_THREAD_DETACH:
+#ifdef THREADS_WIN32
g_thread_win32_thread_detach ();
+#endif
break;
default:
@@ -237,9 +273,14 @@ DllMain (HINSTANCE hinstDLL,
return TRUE;
}
-#elif defined (__GNUC__)
+#elif defined (G_HAS_CONSTRUCTORS)
-__attribute__ ((constructor)) static void
+#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
+#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(glib_init_ctor)
+#endif
+G_DEFINE_CONSTRUCTOR(glib_init_ctor)
+
+static void
glib_init_ctor (void)
{
glib_init ();