[geany/geany] 11acb5: Add code for TMTag reference debugging
Colomban Wendling
git-noreply at xxxxx
Sun Mar 17 16:31:36 UTC 2013
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Sun, 17 Mar 2013 16:31:36 UTC
Commit: 11acb599806eb5fe1a4c607ec9d05f4952988da9
https://github.com/geany/geany/commit/11acb599806eb5fe1a4c607ec9d05f4952988da9
Log Message:
-----------
Add code for TMTag reference debugging
This code is disabled by default, and is enabled if the DEBUG_TAG_REFS
C preprocessor macro is defined.
Modified Paths:
--------------
tagmanager/src/tm_tag.c
Modified: tagmanager/src/tm_tag.c
55 files changed, 55 insertions(+), 0 deletions(-)
===================================================================
@@ -23,6 +23,61 @@
#define TAG_FREE(T) g_slice_free(TMTag, (T))
+#ifdef DEBUG_TAG_REFS
+
+static GHashTable *alive_tags = NULL;
+
+static void foreach_tags_log(gpointer key, gpointer value, gpointer data)
+{
+ gsize *ref_count = data;
+ const TMTag *tag = value;
+
+ *ref_count += (gsize) tag->refcount;
+ g_debug("Leaked TMTag (%d refs): %s", tag->refcount, tag->name);
+}
+
+static void log_refs_at_exit(void)
+{
+ gsize ref_count = 0;
+
+ g_hash_table_foreach(alive_tags, foreach_tags_log, &ref_count);
+ g_debug("TMTag references left at exit: %lu", ref_count);
+}
+
+static TMTag *log_tag_new(void)
+{
+ TMTag *tag;
+
+ if (! alive_tags)
+ {
+ alive_tags = g_hash_table_new(g_direct_hash, g_direct_equal);
+ atexit(log_refs_at_exit);
+ }
+ TAG_NEW(tag);
+ g_hash_table_insert(alive_tags, tag, tag);
+
+ return tag;
+}
+
+static void log_tag_free(TMTag *tag)
+{
+ g_return_if_fail(alive_tags != NULL);
+
+ if (! g_hash_table_remove(alive_tags, tag)) {
+ g_critical("Freeing invalid TMTag pointer %p", (void *) tag);
+ } else {
+ TAG_FREE(tag);
+ }
+}
+
+#undef TAG_NEW
+#undef TAG_FREE
+#define TAG_NEW(T) ((T) = log_tag_new())
+#define TAG_FREE(T) log_tag_free(T)
+
+#endif /* DEBUG_TAG_REFS */
+
+
/* Note: To preserve binary compatibility, it is very important
that you only *append* to this list ! */
enum
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list