diff --git a/ChangeLog b/ChangeLog index 0365c9813..c9ee6af36 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 0365c9813..c9ee6af36 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 0365c9813..c9ee6af36 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 0365c9813..c9ee6af36 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 0365c9813..c9ee6af36 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 0365c9813..c9ee6af36 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 0365c9813..c9ee6af36 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 0365c9813..c9ee6af36 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,16 @@ +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + Wed Feb 20 22:35:42 2002 Owen Taylor Fixes from Miroslaw Dobrzanski-Neumann (#71963) diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 5aacdf360..f99549a84 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,12 @@ +2002-02-21 Matthias Clasen + + * glib/Makefile.am (IGNORE_HFILES): Add gdebug.h. + + * glib/running.sgml: Document the G_DEBUG environment variable. + + * glib/tmpl/threads.sgml: Replace g_thread_wait() by + g_thread_join() in two places. + 2002-02-20 Sven Neumann * gobject/gobject-sections.txt diff --git a/docs/reference/glib/Makefile.am b/docs/reference/glib/Makefile.am index fcce6f5b4..e44a3c266 100644 --- a/docs/reference/glib/Makefile.am +++ b/docs/reference/glib/Makefile.am @@ -34,7 +34,8 @@ IGNORE_HFILES= \ gunicomp.h \ gunidecomp.h \ gunichartables.h \ - glibconfig-sysdefs.h + glibconfig-sysdefs.h \ + gdebug.h # Extra files to add when scanning EXTRA_HFILES= diff --git a/docs/reference/glib/running.sgml b/docs/reference/glib/running.sgml index c1cfac84f..94d551206 100644 --- a/docs/reference/glib/running.sgml +++ b/docs/reference/glib/running.sgml @@ -38,7 +38,27 @@ variables like LANG, PATH or HOME. A list of log levels for which messages should be prefixed by the program name and PID of the application. The default is to prefix - everything except %G_LOG_LEVEL_MESSAGE and %G_LOG_LEVEL_INFO. + everything except G_LOG_LEVEL_MESSAGE and G_LOG_LEVEL_INFO. + + + + + <envar>G_DEBUG</envar> + + + If GLib has been configured with , + this variable can be set to a list of debug options, which cause GLib + to print out different types of debugging information. + + + fatal_warnings + Causes GLib to abort the program at the first call + to g_warning(). This option is + special in that it doesn't require GLib to be configured with + debugging support. + + + @@ -61,9 +81,9 @@ static volatile gulong g_trap_free_size; static volatile gulong g_trap_realloc_size; static volatile gulong g_trap_malloc_size; -If set to a size > 0, g_free(), -g_realloc() and -g_malloc() will be intercepted if the size +If set to a size > 0, g_free(), +g_realloc() and +g_malloc() will be intercepted if the size matches the size of the corresponding memory block. This will only work with g_mem_set_vtable (glib_mem_profiler_table) upon startup though, because memory profiling is required to match on the memory block sizes. diff --git a/docs/reference/glib/tmpl/threads.sgml b/docs/reference/glib/tmpl/threads.sgml index 36b13d136..76ac5c207 100644 --- a/docs/reference/glib/tmpl/threads.sgml +++ b/docs/reference/glib/tmpl/threads.sgml @@ -274,7 +274,7 @@ This function creates a new thread with the priority @priority. If @joinable is %TRUE, you can wait for this threads termination -calling g_thread_wait(). Otherwise the thread will just disappear, when +calling g_thread_join(). Otherwise the thread will just disappear, when ready. @@ -304,7 +304,7 @@ platform, if @stack_size is 0. If @joinable is %TRUE, you can wait for this threads termination -calling g_thread_wait(). Otherwise the thread will just disappear, when +calling g_thread_join(). Otherwise the thread will just disappear, when ready. If @bound is %TRUE, this thread will be scheduled in the system scope, otherwise the implementation is free to do scheduling in the process scope. The first variant is more expensive resource-wise, but diff --git a/glib/Makefile.am b/glib/Makefile.am index b9b772ebf..10cf85311 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -81,7 +81,8 @@ libglib_1_3_la_SOURCES = \ gunicomp.h \ gunidecomp.h \ gunidecomp.c \ - gutils.c + gutils.c \ + gdebug.h EXTRA_libglib_1_3_la_SOURCES = \ giounix.c \ diff --git a/glib/gdebug.h b/glib/gdebug.h new file mode 100644 index 000000000..a4dc06dfe --- /dev/null +++ b/glib/gdebug.h @@ -0,0 +1,63 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_DEBUG_H__ +#define __G_DEBUG_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef enum { + G_DEBUG_FATAL_WARNINGS = 1 << 0, +} GDebugFlag; + + +#ifdef G_ENABLE_DEBUG + +#define G_NOTE(type, action) G_STMT_START { \ + if (!_g_debug_initialized) \ + { _g_debug_init (); } \ + if (_g_debug_flags & G_DEBUG_##type) \ + { action; }; } G_STMT_END + +#else /* !G_ENABLE_DEBUG */ + +#define G_NOTE(type, action) + +#endif /* G_ENABLE_DEBUG */ + +GLIB_VAR gboolean _g_debug_initialized; +GLIB_VAR guint _g_debug_flags; + +void _g_debug_init (); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __G_DEBUG_H__ */ diff --git a/glib/gmessages.c b/glib/gmessages.c index 3dbd90151..691c12dcc 100644 --- a/glib/gmessages.c +++ b/glib/gmessages.c @@ -43,6 +43,7 @@ #include #include #include +#include "gdebug.h" #ifdef G_OS_WIN32 typedef FILE* GFileDescriptor; @@ -206,38 +207,40 @@ write_string (GFileDescriptor fd, write (fd, string, strlen (string)); } +static GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG; + +static inline void +g_log_msg_prefix_init () +{ + static gboolean initialized = FALSE; + const gchar *val; + + if (!initialized) { + + initialized = TRUE; + val = g_getenv ("G_MESSAGES_PREFIXED"); + + if (val) + { + static const GDebugKey keys[] = { + { "error", G_LOG_LEVEL_ERROR }, + { "critical", G_LOG_LEVEL_CRITICAL }, + { "warning", G_LOG_LEVEL_WARNING }, + { "message", G_LOG_LEVEL_MESSAGE }, + { "info", G_LOG_LEVEL_INFO }, + { "debug", G_LOG_LEVEL_DEBUG } + }; + + g_log_msg_prefix = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); + } + } +} + static void g_log_write_prefix (GFileDescriptor fd, GLogLevelFlags mask) { - static GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG; - static gboolean initialized = FALSE; - - g_mutex_lock (g_messages_lock); - - if (!initialized) - { - const gchar *val; - initialized = TRUE; - - val = g_getenv ("G_MESSAGES_PREFIXED"); - - if (val) - { - static const GDebugKey keys[] = { - { "error", G_LOG_LEVEL_ERROR }, - { "critical", G_LOG_LEVEL_CRITICAL }, - { "warning", G_LOG_LEVEL_WARNING }, - { "message", G_LOG_LEVEL_MESSAGE }, - { "info", G_LOG_LEVEL_INFO }, - { "debug", G_LOG_LEVEL_DEBUG } - }; - - g_log_msg_prefix = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); - } - } - - g_mutex_unlock (g_messages_lock); + g_log_msg_prefix_init (); if ((g_log_msg_prefix & mask) == mask) { @@ -504,6 +507,9 @@ g_logv (const gchar *log_domain, va_end (args2); #endif /* !HAVE_VSNPRINTF */ + if (!_g_debug_initialized) + _g_debug_init (); + for (i = g_bit_nth_msf (log_level, -1); i >= 0; i = g_bit_nth_msf (log_level, i)) { register GLogLevelFlags test_level; @@ -1186,6 +1192,37 @@ g_printf_string_upper_bound (const gchar *format, void g_messages_init (void) { - g_messages_lock = g_mutex_new(); - g_log_depth = g_private_new(NULL); + g_messages_lock = g_mutex_new (); + g_log_depth = g_private_new (NULL); + g_log_msg_prefix_init (); + _g_debug_init (); +} + +gboolean _g_debug_initialized = FALSE; +guint _g_debug_flags = 0; + +void _g_debug_init () +{ + const gchar *val; + + _g_debug_initialized = TRUE; + + val = g_getenv ("G_DEBUG"); + if (val != NULL) + { + static const GDebugKey keys[] = { + {"fatal_warnings", G_DEBUG_FATAL_WARNINGS} + }; + + _g_debug_flags = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); + } + + if (_g_debug_flags & G_DEBUG_FATAL_WARNINGS) + { + GLogLevelFlags fatal_mask; + + fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); + fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; + g_log_set_always_fatal (fatal_mask); + } }