From: Carl Worth Date: Fri, 16 Oct 2009 20:42:42 +0000 (-0700) Subject: Fix more memory leaks. X-Git-Tag: 0.1~846 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=9c3807e688e587070407f671e884bf1e9b9892a5;p=notmuch.git 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. --- diff --git a/notmuch-index-message.cc b/notmuch-index-message.cc index dfb1825e..e3de80f1 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; }