# HG changeset patch # User Richard Laager # Date 1177441968 0 # Node ID 05033ae856b25819fb3438d77e3a1c59ffd5ffd6 # Parent 5f6abf3a5369883fe61a10263153be2baf65bb73 Fix the memory leaking and improper calls to ref_filename(). Also, remove some debugging code. diff -r 5f6abf3a5369 -r 05033ae856b2 libpurple/buddyicon.c --- a/libpurple/buddyicon.c Tue Apr 24 17:00:51 2007 +0000 +++ b/libpurple/buddyicon.c Tue Apr 24 19:12:48 2007 +0000 @@ -62,7 +62,6 @@ g_return_if_fail(filename != NULL); refs = GPOINTER_TO_INT(g_hash_table_lookup(icon_file_cache, filename)); - printf("refs before increment = %d\n", refs); g_hash_table_insert(icon_file_cache, g_strdup(filename), GINT_TO_POINTER(refs + 1)); @@ -77,7 +76,6 @@ return; refs = GPOINTER_TO_INT(g_hash_table_lookup(icon_file_cache, filename)); - printf("refs before decrement = %d\n", refs); if (refs == 1) { @@ -176,26 +174,21 @@ /* It's possible that there are other references to this icon * cache file that are not currently loaded into memory. */ - printf("file has %d refs\n", GPOINTER_TO_INT(g_hash_table_lookup(icon_file_cache, filename))); if (GPOINTER_TO_INT(g_hash_table_lookup(icon_file_cache, filename))) return; dirname = purple_buddy_icons_get_cache_dir(); path = g_build_filename(dirname, filename, NULL); - printf("Going to unlink %s\n", path); if (g_file_test(path, G_FILE_TEST_EXISTS)) { if (g_unlink(path)) { - printf("Failed to unlink %s\n", path); - purple_debug_error("buddyicon", "Failed to delete %s: %s\n", path, strerror(errno)); } else { - printf("Unlinked %s\n", path); purple_debug_info("buddyicon", "Deleted cache file: %s\n", path); } } @@ -203,6 +196,12 @@ g_free(path); } +gboolean +value_equals(gpointer key, gpointer value, gpointer user_data) +{ + return (value == user_data); +} + static void image_deleting_cb(PurpleStoredImage *img, gpointer data) { @@ -212,6 +211,10 @@ { purple_buddy_icon_data_uncache_file(filename); g_hash_table_remove(icon_data_cache, filename); + + /* We could make this O(1) by using another hash table, but + * this is probably good enough. */ + g_hash_table_foreach_remove(custom_icon_cache, value_equals, img); } } @@ -385,14 +388,12 @@ purple_blist_node_set_string((PurpleBlistNode *)buddy, "buddy_icon", filename); - printf("Calling ref_filename(%s)\n", filename); ref_filename(filename); } else { purple_blist_node_remove_setting((PurpleBlistNode *)buddy, "buddy_icon"); } - printf("Calling unref_filename(%s)\n", old_icon); unref_filename(old_icon); g_free(old_icon); } @@ -418,10 +419,8 @@ if (data != NULL && len > 0) icon->img = purple_buddy_icon_data_new(data, len, NULL); - printf("Calling purple_buddy_icon_update\n"); purple_buddy_icon_update(icon); - printf("Calling purple_imgstore_unref\n"); purple_imgstore_unref(old_img); } @@ -815,8 +814,9 @@ purple_blist_node_remove_setting(node, "buddy_icon"); } + else + ref_filename(filename); g_free(path); - ref_filename(filename); } } } @@ -841,8 +841,9 @@ purple_blist_node_remove_setting(node, "custom_buddy_icon"); } + else + ref_filename(filename); g_free(path); - ref_filename(filename); } } } diff -r 5f6abf3a5369 -r 05033ae856b2 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Tue Apr 24 17:00:51 2007 +0000 +++ b/pidgin/gtkblist.c Tue Apr 24 19:12:48 2007 +0000 @@ -2215,14 +2215,14 @@ loader = gdk_pixbuf_loader_new(); gdk_pixbuf_loader_write(loader, data, len, NULL); gdk_pixbuf_loader_close(loader, NULL); + + purple_imgstore_unref(custom_img); + buf = gdk_pixbuf_loader_get_pixbuf(loader); if (buf) g_object_ref(G_OBJECT(buf)); g_object_unref(G_OBJECT(loader)); - // TODO: FIX THIS!!! - //purple_imgstore_unref(custom_img); - if (buf) { int orig_width, orig_height; int scale_width, scale_height; diff -r 5f6abf3a5369 -r 05033ae856b2 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Tue Apr 24 17:00:51 2007 +0000 +++ b/pidgin/gtkconv.c Tue Apr 24 19:12:48 2007 +0000 @@ -6259,14 +6259,14 @@ loader = gdk_pixbuf_loader_new(); gdk_pixbuf_loader_write(loader, data, len, NULL); gdk_pixbuf_loader_close(loader, &err); + + purple_imgstore_unref(custom_img); + anim = gdk_pixbuf_loader_get_animation(loader); if (anim) g_object_ref(G_OBJECT(anim)); g_object_unref(loader); - // TODO: FIX THIS!!! - //purple_imgstore_unref(custom_img); - if (!anim) return; gtkconv->u.im->anim = anim;