X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fglib-init.c;h=df812c7d0365ad7fd936cbca7fa0d3c91d205994;hb=ecf1359191b2f796a7d63288652dd1a93525417d;hp=ffc3a2f3b3b11fed5be56e375e6c592d3199a73d;hpb=47444dacc069be5984df4064ae382d45a9ae8c9e;p=platform%2Fupstream%2Fglib.git diff --git a/glib/glib-init.c b/glib/glib-init.c index ffc3a2f..df812c7 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,32 @@ #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 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 +81,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 +117,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 +170,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 +187,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 +205,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; -} + g_log_always_fatal |= flags & G_LOG_LEVEL_MASK; -static void -g_mem_init (void) -{ - const GDebugKey keys[] = { - { "gc-friendly", 1 }, - }; - - 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 +230,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,10 +249,19 @@ 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: /* do nothing */ ; @@ -233,9 +270,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 ();