diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2012-10-13 18:35:14 -0400 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2012-10-15 10:02:48 -0400 |
commit | 474abdb3bad65cf79b0e761d962edc8b94d51dcc (patch) | |
tree | b5914e58983b2e67a50738dc9a1c38907b69d10c | |
parent | 4dde18ac33476519f2fa7fb925d278f2de67d963 (diff) | |
download | nautilus-474abdb3bad65cf79b0e761d962edc8b94d51dcc.tar.gz |
search-directory: fix a FIXME
Using an auxiliary hash table gives us better performance for large
directories, as we avoid constantly walking the list.
-rw-r--r-- | libnautilus-private/nautilus-search-directory.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c index 984c78f74..551bd57a1 100644 --- a/libnautilus-private/nautilus-search-directory.c +++ b/libnautilus-private/nautilus-search-directory.c @@ -49,6 +49,7 @@ struct NautilusSearchDirectoryDetails { gboolean search_finished; GList *files; + GHashTable *files_hash; GList *monitor_list; GList *callback_list; @@ -119,6 +120,8 @@ reset_file_list (NautilusSearchDirectory *search) nautilus_file_list_free (search->details->files); search->details->files = NULL; + + g_hash_table_remove_all (search->details->files_hash); } static void @@ -530,6 +533,7 @@ search_engine_hits_added (NautilusSearchEngine *engine, GList *hits, g_signal_connect (file, "changed", G_CALLBACK (file_changed), search), file_list = g_list_prepend (file_list, file); + g_hash_table_replace (search->details->files_hash, file, GINT_TO_POINTER (1)); } search->details->files = g_list_concat (search->details->files, file_list); @@ -657,9 +661,7 @@ search_contains_file (NautilusDirectory *directory, NautilusSearchDirectory *search; search = NAUTILUS_SEARCH_DIRECTORY (directory); - - /* FIXME: Maybe put the files in a hash */ - return (g_list_find (search->details->files, file) != NULL); + return (g_hash_table_lookup (search->details->files_hash, file) != NULL); } static GList * @@ -784,6 +786,8 @@ search_finalize (GObject *object) search = NAUTILUS_SEARCH_DIRECTORY (object); g_free (search->details->saved_search_uri); + g_hash_table_destroy (search->details->files_hash); + G_OBJECT_CLASS (nautilus_search_directory_parent_class)->finalize (object); } @@ -793,6 +797,8 @@ nautilus_search_directory_init (NautilusSearchDirectory *search) search->details = G_TYPE_INSTANCE_GET_PRIVATE (search, NAUTILUS_TYPE_SEARCH_DIRECTORY, NautilusSearchDirectoryDetails); + search->details->files_hash = g_hash_table_new (g_direct_hash, g_direct_equal); + search->details->engine = nautilus_search_engine_new (); g_signal_connect (search->details->engine, "hits-added", G_CALLBACK (search_engine_hits_added), |