s/glib_trap_/g_trap_/. add comments on g_trap_instance_signals,
authorTim Janik <timj@gtk.org>
Sun, 4 Feb 2001 07:03:52 +0000 (07:03 +0000)
committerTim Janik <timj@src.gnome.org>
Sun, 4 Feb 2001 07:03:52 +0000 (07:03 +0000)
Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>

        * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
        g_trap_instance_signals, g_trace_instance_signals and
        GRUNTIME_DEBUG.

        * gmem.c: s/glib_trap_/g_trap_/.

Sun Feb  4 07:30:53 2001  Tim Janik  <timj@gtk.org>

        * gtype.[hc]: changed g_type_init() to take debugging flags
        initially, a combination of G_TYPE_DEBUG_OBJECTS and
        G_TYPE_DEBUG_SIGNALS. using the G_TYPE_ prefix is a bit odd
        here, but basically g_type_int() serves as initialization
        fucntion for all of GType, GObject, GSignal, so what the heck.

        * gobject.c: special case debugging code properly.
        changed glib_trap_object_ref to g_trap_object_ref.

        * gsignal.c: add signal emission debugging abilities, along with
        a new trap object g_trap_instance_signals.

19 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/debugging.txt
docs/reference/gobject/tmpl/gobject-unused.sgml
docs/reference/gobject/tmpl/types.sgml
glib/gmem.c
gmem.c
gobject/ChangeLog
gobject/gobject-query.c
gobject/gobject.c
gobject/gsignal.c
gobject/gtype.c
gobject/gtype.h

index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 4d0cc4c67e6086b70d25cc03c5f0356c3ec843f1..4dd323f33433e15bfbe695a6b803bdcae62b33d2 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb  4 07:38:32 2001  Tim Janik  <timj@gtk.org>
+
+       * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on
+       g_trap_instance_signals, g_trace_instance_signals and
+       GRUNTIME_DEBUG.
+
+       * gmem.c: s/glib_trap_/g_trap_/.
+       
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * tests/Makefile.am (thread_LDADD): Change order of libs,
index 6f3bca1cc42b401fd50961193082cdbdb726d37e..abef4dd1b3d8ec441c6390aeb6fd53ef044550da 100644 (file)
@@ -1,7 +1,6 @@
 
-
-G_BREAKPOINT () traps for the debugger
-======================================
+Traps (G_BREAKPOINT) and traces for the debuging
+================================================
 
 Some code portions contain trap variables that can be set during
 debugging time if G_ENABLE_DEBUG has been defined upon compilation
@@ -11,18 +10,32 @@ Such traps lead to immediate code halts to examine the current
 program state and backtrace.
 Currently, the following trap variables exist:
 
-static volatile gulong glib_trap_free_size;
-static volatile gulong glib_trap_realloc_size;
-static volatile gulong glib_trap_malloc_size;
+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()
        respectively, will be intercepted if the size matches the
        size of the corresponding memory block to free/reallocate/allocate.
        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.
-static volatile GObject *glib_trap_object_ref;
+static volatile GObject *g_trap_object_ref;
        If set to a valid object pointer, ref/unref will be intercepted
        with G_BREAKPOINT ();
+static volatile gpointer *g_trap_instance_signals;
+static volatile gpointer *g_trace_instance_signals;
+       If set to a valid instance pointer, debugging messages
+       will be spewed about emissions of signals on this instance.
+       For g_trap_instance_signals matches, the emissions will
+       also be intercepted with G_BREAKPOINT ();
+
+Environment variables for debugging
+===================================
+When G_ENABLE_DEBUG was defined upon compilation, GRuntime supports
+an environment variable GRUNTIME_DEBUG that can be set to a
+combination of the flags passed in to g_type_init() (currently
+"objects" and "signals") to trigger debugging messages about
+object bookkeeping and signal emissions during runtime.
 
 
-2000/12/28     Tim Janik
+2000/02/04     Tim Janik
index 9372f183f7e32167bfa10b3865a3b30f427af2ee..4a51ebefbbb4874274d89dd209db92dcd0dc7fff 100644 (file)
 @param_id: 
 @pspec: 
 
-<!-- ##### FUNCTION g_param_spec_hash_table_insert ##### -->
+<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:See_Also ##### -->
 <para>
 
 </para>
 
-@hash_table: 
-@pspec: 
-@owner_type: 
 
-<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:See_Also ##### -->
+<!-- ##### FUNCTION g_param_spec_hash_table_insert ##### -->
 <para>
 
 </para>
 
+@hash_table: 
+@pspec: 
+@owner_type: 
 
 <!-- ##### MACRO G_IS_PARAM_VALUE ##### -->
 <para>
 @pspec: 
 @trailer: 
 
+<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:Long_Description ##### -->
+<para>
+
+</para>
+
+
 <!-- ##### ENUM GSignalType ##### -->
 <para>
 
 @G_SIGNAL_ACTION: 
 @G_SIGNAL_NO_HOOKS: 
 
-<!-- ##### SECTION ./tmpl/gtypemodule.sgml.sgml:Long_Description ##### -->
-<para>
-
-</para>
-
-
 <!-- ##### FUNCTION g_signal_type_closure_new ##### -->
 <para>
 
index 3994dd5a4887a05ddd9868a21a4d273caaf9aba4..3c9e3abdbe3fc4f3a4fb2f2b3540c934589eab8e 100644 (file)
@@ -398,6 +398,7 @@ the type system and assorted other code portions (such as the various fundamenta
 type implementations or the signal system).
 </para>
 
+@debug_flags: 
 
 
 <!-- ##### FUNCTION g_type_name ##### -->
index bcdc7fcfc67ffaaa38eebd198a918d1ff154af33..52d376530bc5c9df894de30cf6c19777a8708799 100644 (file)
@@ -268,9 +268,9 @@ static gulong profile_frees = 0;
 static gulong profile_mc_frees = 0;
 static GMutex *g_profile_mutex = NULL;
 #ifdef  G_ENABLE_DEBUG
-static volatile gulong glib_trap_free_size = 0;
-static volatile gulong glib_trap_realloc_size = 0;
-static volatile gulong glib_trap_malloc_size = 0;
+static volatile gulong g_trap_free_size = 0;
+static volatile gulong g_trap_realloc_size = 0;
+static volatile gulong g_trap_malloc_size = 0;
 #endif  /* G_ENABLE_DEBUG */
 
 #define        PROFILE_TABLE(f1,f2,f3)   ( ( ((f3) << 2) | ((f2) << 1) | (f1) ) * (MEM_PROFILE_TABLE_SIZE + 1))
@@ -404,7 +404,7 @@ profiler_try_malloc (gsize n_bytes)
   gulong *p;
 
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_malloc_size == n_bytes)
+  if (g_trap_malloc_size == n_bytes)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
 
@@ -442,7 +442,7 @@ profiler_calloc (gsize n_blocks,
   gulong *p;
 
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_malloc_size == l)
+  if (g_trap_malloc_size == l)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
   
@@ -480,7 +480,7 @@ profiler_free (gpointer mem)
   else
     {
 #ifdef  G_ENABLE_DEBUG
-      if (glib_trap_free_size == p[1])
+      if (g_trap_free_size == p[1])
        G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
 
@@ -506,7 +506,7 @@ profiler_try_realloc (gpointer mem,
   p -= 2;
 
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_realloc_size == n_bytes)
+  if (g_trap_realloc_size == n_bytes)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
   
diff --git a/gmem.c b/gmem.c
index bcdc7fcfc67ffaaa38eebd198a918d1ff154af33..52d376530bc5c9df894de30cf6c19777a8708799 100644 (file)
--- a/gmem.c
+++ b/gmem.c
@@ -268,9 +268,9 @@ static gulong profile_frees = 0;
 static gulong profile_mc_frees = 0;
 static GMutex *g_profile_mutex = NULL;
 #ifdef  G_ENABLE_DEBUG
-static volatile gulong glib_trap_free_size = 0;
-static volatile gulong glib_trap_realloc_size = 0;
-static volatile gulong glib_trap_malloc_size = 0;
+static volatile gulong g_trap_free_size = 0;
+static volatile gulong g_trap_realloc_size = 0;
+static volatile gulong g_trap_malloc_size = 0;
 #endif  /* G_ENABLE_DEBUG */
 
 #define        PROFILE_TABLE(f1,f2,f3)   ( ( ((f3) << 2) | ((f2) << 1) | (f1) ) * (MEM_PROFILE_TABLE_SIZE + 1))
@@ -404,7 +404,7 @@ profiler_try_malloc (gsize n_bytes)
   gulong *p;
 
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_malloc_size == n_bytes)
+  if (g_trap_malloc_size == n_bytes)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
 
@@ -442,7 +442,7 @@ profiler_calloc (gsize n_blocks,
   gulong *p;
 
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_malloc_size == l)
+  if (g_trap_malloc_size == l)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
   
@@ -480,7 +480,7 @@ profiler_free (gpointer mem)
   else
     {
 #ifdef  G_ENABLE_DEBUG
-      if (glib_trap_free_size == p[1])
+      if (g_trap_free_size == p[1])
        G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
 
@@ -506,7 +506,7 @@ profiler_try_realloc (gpointer mem,
   p -= 2;
 
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_realloc_size == n_bytes)
+  if (g_trap_realloc_size == n_bytes)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
   
index a0bbcb26f822544d143bdd3ddf06337e80047d7a..e948297d481f450f315bdd8a468374dd7d09ae86 100644 (file)
@@ -1,3 +1,17 @@
+Sun Feb  4 07:30:53 2001  Tim Janik  <timj@gtk.org>
+
+       * gtype.[hc]: changed g_type_init() to take debugging flags
+       initially, a combination of G_TYPE_DEBUG_OBJECTS and
+       G_TYPE_DEBUG_SIGNALS. using the G_TYPE_ prefix is a bit odd
+       here, but basically g_type_int() serves as initialization
+       fucntion for all of GType, GObject, GSignal, so what the heck.
+
+       * gobject.c: special case debugging code properly.
+       changed glib_trap_object_ref to g_trap_object_ref.
+
+       * gsignal.c: add signal emission debugging abilities, along with
+       a new trap object g_trap_instance_signals.
+
 2001-02-04  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am (progs_LDADD): Change order of libs to libgobject
index b80709adcc3b5b338317b64810b8fa6919688bef..8a440db3aad3e0be3705c5529337b0e76b29861d 100644 (file)
@@ -126,7 +126,7 @@ main (gint   argc,
   
   f_out = stdout;
   
-  g_type_init ();
+  g_type_init (0);
   
   root = G_TYPE_OBJECT;
   
index 916996da746a721af5c1ed661db112424f70d4ce..b105133f6fc7e174ba261779e99417fad8855b6f 100644 (file)
@@ -138,15 +138,10 @@ static gulong              gobject_signals[LAST_SIGNAL] = { 0, };
 
 
 /* --- functions --- */
-/* We need an actual method for handling debug keys in GLib.
- * For now, we'll simply use, as a method
- * 'extern gboolean glib_debug_objects'
- */
-gboolean glib_debug_objects = FALSE;
-
 #ifdef G_ENABLE_DEBUG
+#define        IF_DEBUG(debug_type)    if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type)
 G_LOCK_DEFINE_STATIC     (debug_objects);
-static volatile GObject *glib_trap_object_ref = NULL;
+static volatile GObject *g_trap_object_ref = NULL;
 static guint            debug_objects_count = 0;
 static GHashTable      *debug_objects_ht = NULL;
 static void
@@ -155,7 +150,7 @@ debug_objects_foreach (gpointer key,
                       gpointer user_data)
 {
   GObject *object = value;
-  
+
   g_message ("[%p] stale %s\tref_count=%u",
             object,
             G_OBJECT_TYPE_NAME (object),
@@ -164,18 +159,18 @@ debug_objects_foreach (gpointer key,
 static void
 debug_objects_atexit (void)
 {
-  G_LOCK (debug_objects);
-  if (glib_debug_objects)
+  IF_DEBUG (OBJECTS)
     {
+      G_LOCK (debug_objects);
       if (debug_objects_ht)
        {
          g_message ("stale GObjects: %u", debug_objects_count);
          g_hash_table_foreach (debug_objects_ht, debug_objects_foreach, NULL);
        }
+      G_UNLOCK (debug_objects);
     }
-  G_UNLOCK (debug_objects);
 }
-#endif /* G_ENABLE_DEBUG */
+#endif /* G_ENABLE_DEBUG */
 
 void
 g_object_type_init (void)      /* sync with gtype.c */
@@ -218,7 +213,8 @@ g_object_type_init (void)   /* sync with gtype.c */
   g_assert (type == G_TYPE_OBJECT);
   
 #ifdef G_ENABLE_DEBUG
-  g_atexit (debug_objects_atexit);
+  IF_DEBUG (OBJECTS)
+    g_atexit (debug_objects_atexit);
 #endif /* G_ENABLE_DEBUG */
 }
 
@@ -439,17 +435,17 @@ g_object_init (GObject *object)
   
   /* freeze object's notification queue, g_object_new_valist() takes care of that */
   object_freeze_notifies (object);
-
+  
 #ifdef G_ENABLE_DEBUG
-  G_LOCK (debug_objects);
-  if (glib_debug_objects)
+  IF_DEBUG (OBJECTS)
     {
+      G_LOCK (debug_objects);
       if (!debug_objects_ht)
        debug_objects_ht = g_hash_table_new (g_direct_hash, NULL);
       debug_objects_count++;
       g_hash_table_insert (debug_objects_ht, object, object);
+      G_UNLOCK (debug_objects);
     }
-  G_UNLOCK (debug_objects);
 #endif /* G_ENABLE_DEBUG */
 }
 
@@ -522,7 +518,7 @@ g_object_last_unref (GObject *object)
     G_OBJECT_GET_CLASS (object)->shutdown (object);
   
 #ifdef G_ENABLE_DEBUG
-  if (glib_trap_object_ref == object)
+  if (g_trap_object_ref == object)
     G_BREAKPOINT ();
 #endif /* G_ENABLE_DEBUG */
 
@@ -532,10 +528,13 @@ g_object_last_unref (GObject *object)
     {
       G_OBJECT_GET_CLASS (object)->finalize (object);
 #ifdef G_ENABLE_DEBUG
-      G_LOCK (debug_objects);
-      if (glib_debug_objects && debug_objects_ht)
-       g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL);
-      G_UNLOCK (debug_objects);
+      IF_DEBUG (OBJECTS)
+       {
+         G_LOCK (debug_objects);
+         if (debug_objects_ht)
+           g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL);
+         G_UNLOCK (debug_objects);
+       }
 #endif /* G_ENABLE_DEBUG */
       g_type_free_instance ((GTypeInstance*) object);
     }
@@ -557,15 +556,14 @@ g_object_finalize (GObject *object)
   g_datalist_clear (&object->qdata);
   
 #ifdef G_ENABLE_DEBUG
-  G_LOCK (debug_objects);
-  if (glib_debug_objects)
+  IF_DEBUG (OBJECTS)
     {
+      G_LOCK (debug_objects);
       g_assert (g_hash_table_lookup (debug_objects_ht, object) == object);
-      
       g_hash_table_remove (debug_objects_ht, object);
       debug_objects_count--;
+      G_UNLOCK (debug_objects);
     }
-  G_UNLOCK (debug_objects);
 #endif /* G_ENABLE_DEBUG */
 }
 
@@ -1243,7 +1241,7 @@ g_object_ref (gpointer _object)
   g_return_val_if_fail (object->ref_count > 0, NULL);
   
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_object_ref == object)
+  if (g_trap_object_ref == object)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
 
@@ -1261,7 +1259,7 @@ g_object_unref (gpointer _object)
   g_return_if_fail (object->ref_count > 0);
   
 #ifdef  G_ENABLE_DEBUG
-  if (glib_trap_object_ref == object)
+  if (g_trap_object_ref == object)
     G_BREAKPOINT ();
 #endif  /* G_ENABLE_DEBUG */
 
index c251670d96ee586e69c73b30b7a6f24756cd7d1f..827f64014124262e6a748838e5c720529d14add9 100644 (file)
 #define EMISSION_PRE_ALLOC      (16)
 
 #define REPORT_BUG      "please report occourance circumstances to gtk-devel-list@gnome.org"
+#ifdef G_ENABLE_DEBUG
+#define IF_DEBUG(debug_type, cond)     if ((_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) || cond)
+static volatile gpointer *g_trace_instance_signals = NULL;
+static volatile gpointer *g_trap_instance_signals = NULL;
+#endif /* G_ENABLE_DEBUG */
 
 
 /* --- generic allocation --- */
@@ -1743,6 +1748,18 @@ signal_emit_R (SignalNode   *node,
   guint signal_id = node->signal_id;
   gboolean return_value_altered = FALSE;
   
+#ifdef G_ENABLE_DEBUG
+  IF_DEBUG (SIGNALS, g_trace_instance_signals == instance || g_trap_instance_signals == instance)
+    {
+      g_message ("%s::%s(%u) emitted (instance=%p signal-node=%p)\n",
+                g_type_name (G_TYPE_FROM_INSTANCE (instance)),
+                node->name, detail,
+                instance, node);
+      if (g_trap_instance_signals == instance)
+       G_BREAKPOINT ();
+    }
+#endif /* G_ENABLE_DEBUG */
+  
   if (node->flags & G_SIGNAL_NO_RECURSE)
     {
       Emission *emission = emission_find (g_restart_emissions, signal_id, detail, instance);
index 6aaa94b09c00e9b25319644ae3cf0dc8a169dfbf..dd7482871814285f5e3f6b36af279061f462db87 100644 (file)
@@ -69,6 +69,14 @@ static GStaticRWLock            type_rw_lock = G_STATIC_RW_LOCK_INIT;
     else \
       g_error ("%s()%s`%s'", _fname, _action, _tname); \
 }G_STMT_END
+#ifdef  G_ENABLE_DEBUG
+#define DEBUG_CODE(debug_type, code_block)  G_STMT_START {    \
+    if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) \
+      { code_block; }                                     \
+} G_STMT_END
+#else /* !G_ENABLE_DEBUG */
+#define DEBUG_CODE(debug_type, code_block)  /* code_block */
+#endif  /* G_ENABLE_DEBUG */
 
 #define TYPE_FUNDAMENTAL_FLAG_MASK (G_TYPE_FLAG_CLASSED | \
                                    G_TYPE_FLAG_INSTANTIATABLE | \
@@ -202,6 +210,7 @@ static guint           static_n_class_cache_funcs = 0;
 static ClassCacheFunc *static_class_cache_funcs = NULL;
 static GType           static_last_fundamental_id = 0;
 static GQuark          static_quark_type_flags = 0;
+GTypeDebugFlags               _g_type_debug_flags = 0;
 
 
 /* --- externs --- */
@@ -2354,10 +2363,11 @@ extern void     g_signal_init           (void); /* sync with gsignal.c */
 
 /* --- initialization --- */
 void
-g_type_init (void)
+g_type_init (GTypeDebugFlags debug_flags)
 {
   G_LOCK_DEFINE_STATIC (type_init_lock);
   static TypeNode *type0_node = NULL;
+  gchar *env_string;
   GTypeInfo info;
   TypeNode *node;
   GType type;
@@ -2372,6 +2382,22 @@ g_type_init (void)
       G_UNLOCK (type_init_lock);
       return;
     }
+
+  /* setup GRuntime wide debugging flags */
+  _g_type_debug_flags = debug_flags & G_TYPE_DEBUG_MASK;
+  env_string = g_getenv ("GRUNTIME_DEBUG");
+  if (env_string != NULL)
+    {
+      static GDebugKey debug_keys[] = {
+       { "objects", G_TYPE_DEBUG_OBJECTS },
+       { "signals", G_TYPE_DEBUG_SIGNALS },
+      };
+
+      _g_type_debug_flags |= g_parse_debug_string (env_string,
+                                                  debug_keys,
+                                                  sizeof (debug_keys) / sizeof (debug_keys[0]));
+      env_string = NULL;
+    }
   
   /* quarks */
   static_quark_type_flags = g_quark_from_static_string ("GTypeFlags");
index 5e0a18283b52205a14fbe9eccb9561664e9f15e7..2e318b99e8d98c677702cd3ba67a5a9e9993c390 100644 (file)
@@ -168,8 +168,17 @@ struct _GTypeInterface
 #define G_TYPE_FROM_INTERFACE(g_iface)                          (((GTypeInterface*) (g_iface))->g_type)
 
 
+/* debug flags for g_type_init() */
+typedef enum   /*< skip >*/
+{
+  G_TYPE_DEBUG_OBJECTS = 1 << 0,
+  G_TYPE_DEBUG_SIGNALS = 1 << 1,
+  G_TYPE_DEBUG_MASK    = 0x03
+} GTypeDebugFlags;
+
+
 /* --- prototypes --- */
-void     g_type_init                    (void);
+void     g_type_init                    (GTypeDebugFlags        debug_flags);
 gchar*   g_type_name                    (GType                   type);
 GQuark   g_type_qname                   (GType                   type);
 GType    g_type_from_name               (const gchar            *name);
@@ -328,6 +337,7 @@ gboolean     g_type_value_is_a              (GValue             *value,
 GTypeValueTable* g_type_value_table_peek        (GType              type);
 
 
+/* --- implementation bits --- */
 #ifndef G_DISABLE_CAST_CHECKS
 #  define _G_TYPE_CIC(ip, gt, ct) \
     ((ct*) g_type_check_instance_cast ((GTypeInstance*) ip, gt))
@@ -345,6 +355,7 @@ GTypeValueTable* g_type_value_table_peek        (GType                   type);
 #define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
 #define _G_TYPE_IGI(ip, gt, ct)         ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt))
 #define        G_TYPE_FLAG_RESERVED_ID_BIT     (1 << 30)
+extern GTypeDebugFlags                 _g_type_debug_flags;
 
 
 #ifdef __cplusplus