# HG changeset patch # User Mark Doliner # Date 1176662320 0 # Node ID 218818f96b93bf6210db65f29b950626cec28fb0 # Parent 813258bec80cfd3f53b9fa12e64429bce4723c52 Change a g_slist_append() to a g_slist_prepend() in one place, and change some other stuff to use a hashtable instead of a linked list, which should make one aspect of smiley theme destroying O(something fast) instead of O(n). Which really doesn't matter in the grand scheme of things. diff -r 813258bec80c -r 218818f96b93 pidgin/gtkthemes.c --- a/pidgin/gtkthemes.c Sun Apr 15 18:37:20 2007 +0000 +++ b/pidgin/gtkthemes.c Sun Apr 15 18:38:40 2007 +0000 @@ -66,30 +66,30 @@ static void pidginthemes_destroy_smiley_theme(struct smiley_theme *theme) { - GSList *already_freed = NULL; - struct smiley_list *wer = theme->list, *wer2; + GHashTable *already_freed; + struct smiley_list *wer; - while (wer) { + already_freed = g_hash_table_new(g_direct_hash, g_direct_equal); + for (wer = theme->list; wer != NULL; wer = theme->list) { while (wer->smileys) { GtkIMHtmlSmiley *uio = wer->smileys->data; if (uio->icon) g_object_unref(uio->icon); - if (!g_slist_find(already_freed, uio->file)) { + if (g_hash_table_lookup(already_freed, uio->file) == NULL) { g_free(uio->file); - already_freed = g_slist_append(already_freed, uio->file); + g_hash_table_insert(already_freed, uio->file, GINT_TO_POINTER(1)); } g_free(uio->smile); g_free(uio); wer->smileys = g_slist_remove(wer->smileys, uio); } - wer2 = wer->next; + theme->list = wer->next; g_free(wer->sml); g_free(wer); - wer = wer2; } + theme->list = NULL; - g_slist_free(already_freed); - theme->list = NULL; + g_hash_table_destroy(already_freed); } void pidginthemes_load_smiley_theme(const char *file, gboolean load) @@ -193,7 +193,7 @@ smiley->file = sfile; smiley->smile = g_strdup(l); smiley->hidden = hidden; - list->smileys = g_slist_append(list->smileys, smiley); + list->smileys = g_slist_prepend(list->smileys, smiley); have_used_sfile = TRUE; } while (isspace(*i))