From 3c57dd931145d43f2b0aef96c4d178135956bf91 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 05:13:10 +0200 Subject: Adding upstream version 2.10.36. Signed-off-by: Daniel Baumann --- app/gimp-debug.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 app/gimp-debug.c (limited to 'app/gimp-debug.c') diff --git a/app/gimp-debug.c b/app/gimp-debug.c new file mode 100644 index 0000000..a5668ef --- /dev/null +++ b/app/gimp-debug.c @@ -0,0 +1,122 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimp-debug.c + * Copyright (C) 2010 Michael Natterer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "config.h" + +#include + +#include "core/core-types.h" + +#include "core/gimpobject.h" + +#include "gimp-debug.h" + + +static GHashTable *class_hash = NULL; + + +void +gimp_debug_enable_instances (void) +{ + g_return_if_fail (class_hash == NULL); + + class_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify ) g_hash_table_unref); +} + +void +gimp_debug_add_instance (GObject *instance, + GObjectClass *klass) +{ + if (class_hash) + { + 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, instance, instance); + } +} + +void +gimp_debug_remove_instance (GObject *instance) +{ + if (class_hash) + { + GHashTable *instance_hash; + const gchar *type_name; + + type_name = g_type_name (G_OBJECT_TYPE (instance)); + + instance_hash = g_hash_table_lookup (class_hash, type_name); + + if (instance_hash) + { + g_hash_table_remove (instance_hash, instance); + + if (g_hash_table_size (instance_hash) == 0) + g_hash_table_remove (class_hash, type_name); + } + } +} + +static void +gimp_debug_instance_foreach (GObject *instance) +{ + g_printerr (" \'%s\': ref_count = %d\n", + GIMP_IS_OBJECT (instance) ? + gimp_object_get_name (instance) : "GObject", + instance->ref_count); +} + +static void +gimp_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_debug_instance_foreach, + NULL); +} + +void +gimp_debug_instances (void) +{ + if (class_hash) + { + g_hash_table_foreach (class_hash, + (GHFunc) gimp_debug_class_foreach, + NULL); + } +} -- cgit v1.2.3