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.
This commit is contained in:
Carl Worth 2009-10-16 13:42:42 -07:00
parent 28c0691ab9
commit 9c3807e688

View file

@ -411,7 +411,8 @@ find_thread_ids (Xapian::Database db,
const char *parent_message_id; const char *parent_message_id;
GPtrArray *result; 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); find_messages_by_term (db, "ref", message_id, &child, &children_end);
for ( ; child != children_end; child++) { for ( ; child != children_end; child++) {
@ -432,6 +433,13 @@ find_thread_ids (Xapian::Database db,
char *id = (char *) l->data; char *id = (char *) l->data;
g_ptr_array_add (result, id); 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; return result;
} }