app: move the instance debug facility to the new file app/gimp-debug.c

Build it unconditionally but enable it via GIMP_DEBUG=instances
This commit is contained in:
Michael Natterer 2010-06-24 19:11:56 +02:00
parent c448cc7d25
commit b2b1cb135b
6 changed files with 17 additions and 88 deletions

View File

@ -66,6 +66,8 @@ libapp_sources = \
units.h \ units.h \
version.c \ version.c \
version.h \ version.h \
gimp-debug.c \
gimp-debug.h \
gimp-log.c \ gimp-log.c \
gimp-log.h \ gimp-log.h \
gimp-intl.h gimp-intl.h

View File

@ -59,6 +59,7 @@
#include "batch.h" #include "batch.h"
#include "errors.h" #include "errors.h"
#include "units.h" #include "units.h"
#include "gimp-debug.h"
#include "gimp-intl.h" #include "gimp-intl.h"
@ -255,9 +256,7 @@ app_run (const gchar *full_prog_name,
g_object_unref (gimp); g_object_unref (gimp);
#ifdef DEBUG_INSTANCES gimp_debug_instances ();
gimp_object_debug_instances ();
#endif
errors_exit (); errors_exit ();
gegl_exit (); gegl_exit ();

View File

@ -29,6 +29,8 @@
#include "gimpmarshal.h" #include "gimpmarshal.h"
#include "gimpobject.h" #include "gimpobject.h"
#include "gimp-debug.h"
enum enum
{ {
@ -75,10 +77,6 @@ static GObjectClass *parent_class = NULL;
static guint object_signals[LAST_SIGNAL] = { 0 }; static guint object_signals[LAST_SIGNAL] = { 0 };
#ifdef DEBUG_INSTANCES
static GHashTable *class_hash = NULL;
#endif
GType GType
gimp_object_get_type (void) gimp_object_get_type (void)
@ -150,13 +148,6 @@ gimp_object_class_init (GimpObjectClass *klass)
G_PARAM_CONSTRUCT)); G_PARAM_CONSTRUCT));
g_type_class_add_private (klass, g_type_class_add_private (klass,
sizeof (GimpObjectPrivate)); sizeof (GimpObjectPrivate));
#ifdef DEBUG_INSTANCES
class_hash = g_hash_table_new_full (g_str_hash,
g_str_equal,
NULL,
(GDestroyNotify )g_hash_table_unref);
#endif
} }
static void static void
@ -169,25 +160,7 @@ gimp_object_init (GimpObject *object,
object->p->name = NULL; object->p->name = NULL;
object->p->normalized = NULL; object->p->normalized = NULL;
#ifdef DEBUG_INSTANCES gimp_debug_add_instance (G_OBJECT (object), G_OBJECT_CLASS (klass));
{
GHashTable *instance_hash;
const gchar *type_name;
type_name = g_type_name (G_TYPE_FROM_CLASS (klass));
instance_hash = g_hash_table_lookup (class_hash, type_name);
if (! instance_hash)
{
instance_hash = g_hash_table_new (g_direct_hash,
g_direct_equal);
g_hash_table_insert (class_hash, (gchar *) type_name, instance_hash);
}
g_hash_table_insert (instance_hash, object, object);
}
#endif /* DEBUG_INSTANCES */
} }
static void static void
@ -210,24 +183,7 @@ gimp_object_finalize (GObject *object)
{ {
gimp_object_name_free (GIMP_OBJECT (object)); gimp_object_name_free (GIMP_OBJECT (object));
#ifdef DEBUG_INSTANCES gimp_debug_remove_instance (object);
{
GHashTable *instance_hash;
const gchar *type_name;
type_name = g_type_name (G_OBJECT_TYPE (object));
instance_hash = g_hash_table_lookup (class_hash, type_name);
if (instance_hash)
{
g_hash_table_remove (instance_hash, object);
if (g_hash_table_size (instance_hash) == 0)
g_hash_table_remove (class_hash, type_name);
}
}
#endif /* DEBUG_INSTANCES */
G_OBJECT_CLASS (parent_class)->finalize (object); G_OBJECT_CLASS (parent_class)->finalize (object);
} }
@ -568,32 +524,3 @@ gimp_object_real_get_memsize (GimpObject *object,
return memsize + gimp_g_object_get_memsize ((GObject *) object); return memsize + gimp_g_object_get_memsize ((GObject *) object);
} }
#ifdef DEBUG_INSTANCES
static void
gimp_object_debug_instance_foreach (GimpObject *object)
{
g_printerr (" \'%s\': ref_count = %d\n",
gimp_object_get_name (object), G_OBJECT (object)->ref_count);
}
static void
gimp_object_debug_class_foreach (const gchar *type_name,
GHashTable *instance_hash)
{
g_printerr ("Leaked %s instances: %d\n",
type_name, g_hash_table_size (instance_hash));
g_hash_table_foreach (instance_hash,
(GHFunc) gimp_object_debug_instance_foreach,
NULL);
}
void
gimp_object_debug_instances (void)
{
g_hash_table_foreach (class_hash,
(GHFunc) gimp_object_debug_class_foreach,
NULL);
}
#endif /* DEBUG_INSTANCES */

View File

@ -70,11 +70,5 @@ gint gimp_object_name_collate (GimpObject *object1,
gint64 gimp_object_get_memsize (GimpObject *object, gint64 gimp_object_get_memsize (GimpObject *object,
gint64 *gui_size); gint64 *gui_size);
/* #define DEBUG_INSTANCES 1 */
#ifdef DEBUG_INSTANCES
void gimp_object_debug_instances (void);
#endif
#endif /* __GIMP_OBJECT_H__ */ #endif /* __GIMP_OBJECT_H__ */

View File

@ -19,6 +19,7 @@
#include "glib-object.h" #include "glib-object.h"
#include "gimp-debug.h"
#include "gimp-log.h" #include "gimp-log.h"
@ -52,7 +53,8 @@ gimp_log_init (void)
{ "shm", GIMP_LOG_SHM }, { "shm", GIMP_LOG_SHM },
{ "text-editing", GIMP_LOG_TEXT_EDITING }, { "text-editing", GIMP_LOG_TEXT_EDITING },
{ "key-events", GIMP_LOG_KEY_EVENTS }, { "key-events", GIMP_LOG_KEY_EVENTS },
{ "auto-tab-style", GIMP_LOG_AUTO_TAB_STYLE } { "auto-tab-style", GIMP_LOG_AUTO_TAB_STYLE },
{ "instances", GIMP_LOG_INSTANCES }
}; };
/* g_parse_debug_string() has special treatment of the string 'help', /* g_parse_debug_string() has special treatment of the string 'help',
@ -64,6 +66,9 @@ gimp_log_init (void)
gimp_log_flags = g_parse_debug_string (env_log_val, gimp_log_flags = g_parse_debug_string (env_log_val,
log_keys, log_keys,
G_N_ELEMENTS (log_keys)); G_N_ELEMENTS (log_keys));
if (gimp_log_flags & GIMP_LOG_INSTANCES)
gimp_debug_enable_instances ();
} }
} }

View File

@ -36,7 +36,8 @@ typedef enum
GIMP_LOG_SHM = 1 << 12, GIMP_LOG_SHM = 1 << 12,
GIMP_LOG_TEXT_EDITING = 1 << 13, GIMP_LOG_TEXT_EDITING = 1 << 13,
GIMP_LOG_KEY_EVENTS = 1 << 14, GIMP_LOG_KEY_EVENTS = 1 << 14,
GIMP_LOG_AUTO_TAB_STYLE = 1 << 15 GIMP_LOG_AUTO_TAB_STYLE = 1 << 15,
GIMP_LOG_INSTANCES = 1 << 16
} GimpLogFlags; } GimpLogFlags;
@ -93,6 +94,7 @@ void gimp_logv (const gchar *function,
#define TEXT_EDITING GIMP_LOG_TEXT_EDITING #define TEXT_EDITING GIMP_LOG_TEXT_EDITING
#define KEY_EVENTS GIMP_LOG_KEY_EVENTS #define KEY_EVENTS GIMP_LOG_KEY_EVENTS
#define AUTO_TAB_STYLE GIMP_LOG_AUTO_TAB_STYLE #define AUTO_TAB_STYLE GIMP_LOG_AUTO_TAB_STYLE
#define INSTANCES GIMP_LOG_INSTANCES
#if 0 /* last resort */ #if 0 /* last resort */
# define GIMP_LOG /* nothing => no varargs, no log */ # define GIMP_LOG /* nothing => no varargs, no log */