aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-10-16 13:42:42 -0700
committerCarl Worth <cworth@cworth.org>2009-10-16 13:45:17 -0700
commit9c3807e688e587070407f671e884bf1e9b9892a5 (patch)
tree1e4a2b1b04e2eedd94b2613a83402f89da4461cc
parent28c0691ab96b4550b6b5ec80d441cefc591e1098 (diff)
Fix more memory leaks.
These were more significant than the previous leak because these were in the loop and leaking memory for every message being parsed. It turns out that g_hash_table_new should probably be named g_hash_table_new_and_leak_memory_please. The actually useful function is g_hash_table_new_full which lets us pass a free function, (to free keys when inserting duplicates into the hash table). And after all, weeding out duplicates is the only reason we are using this hash table in the first place. It almost goes without saying, valgrind found these leaks.
-rw-r--r--notmuch-index-message.cc10
1 files changed, 9 insertions, 1 deletions
diff --git a/notmuch-index-message.cc b/notmuch-index-message.cc
index dfb1825..e3de80f 100644
--- a/notmuch-index-message.cc
+++ b/notmuch-index-message.cc
@@ -411,7 +411,8 @@ find_thread_ids (Xapian::Database db,
const char *parent_message_id;
GPtrArray *result;
- thread_ids = g_hash_table_new (g_str_hash, g_str_equal);
+ thread_ids = g_hash_table_new_full (g_str_hash, g_str_equal,
+ free, NULL);
find_messages_by_term (db, "ref", message_id, &child, &children_end);
for ( ; child != children_end; child++) {
@@ -432,6 +433,13 @@ find_thread_ids (Xapian::Database db,
char *id = (char *) l->data;
g_ptr_array_add (result, id);
}
+ g_list_free (keys);
+
+ /* We're done with the hash table, but we've taken the pointers to
+ * the allocated strings and put them into our result array, so
+ * tell the hash not to free them on its way out. */
+ g_hash_table_steal_all (thread_ids);
+ g_hash_table_unref (thread_ids);
return result;
}