Fix more memory leaks.
authorCarl Worth <cworth@cworth.org>
Fri, 16 Oct 2009 20:42:42 +0000 (13:42 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 16 Oct 2009 20:45:17 +0000 (13:45 -0700)
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.

notmuch-index-message.cc

index dfb1825edccb578566b8a33105a508710feb9119..e3de80f1ec63e9d7877e11485425f3d368ccfc83 100644 (file)
@@ -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;
 }