diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2014-02-17 15:44:34 -0800 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2014-02-17 15:45:45 -0800 |
commit | ea52580945dc9bc8d0f63b8984e345ac65131ee1 (patch) | |
tree | bdbd5cec2baaa7291558d79a7a56ed3d9a888d2b | |
parent | dfdacd786329201fe3ea936c9ddc67cb3c87c07e (diff) | |
download | nautilus-ea52580945dc9bc8d0f63b8984e345ac65131ee1.tar.gz |
directory: collect all directories when invalidating
Otherwise we risk modifying the directories hash table from within the
iteration callback, which will trigger a critical warning.
https://bugzilla.gnome.org/show_bug.cgi?id=697890
-rw-r--r-- | libnautilus-private/nautilus-directory.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/libnautilus-private/nautilus-directory.c b/libnautilus-private/nautilus-directory.c index 98dac7961..8239cbe3f 100644 --- a/libnautilus-private/nautilus-directory.c +++ b/libnautilus-private/nautilus-directory.c @@ -244,28 +244,37 @@ nautilus_directory_finalize (GObject *object) } static void -invalidate_one_count (gpointer key, gpointer value, gpointer user_data) +collect_all_directories (gpointer key, gpointer value, gpointer callback_data) { NautilusDirectory *directory; - - g_assert (key != NULL); - g_assert (NAUTILUS_IS_DIRECTORY (value)); - g_assert (user_data == NULL); + GList **dirs; directory = NAUTILUS_DIRECTORY (value); - - nautilus_directory_invalidate_count_and_mime_list (directory); + dirs = callback_data; + + *dirs = g_list_prepend (*dirs, nautilus_directory_ref (directory)); } static void filtering_changed_callback (gpointer callback_data) { + GList *dirs, *l; + NautilusDirectory *directory; + g_assert (callback_data == NULL); + dirs = NULL; + g_hash_table_foreach (directories, collect_all_directories, &dirs); + /* Preference about which items to show has changed, so we * can't trust any of our precomputed directory counts. */ - g_hash_table_foreach (directories, invalidate_one_count, NULL); + for (l = dirs; l != NULL; l = l->next) { + directory = NAUTILUS_DIRECTORY (l->data); + nautilus_directory_invalidate_count_and_mime_list (directory); + } + + nautilus_directory_list_unref (dirs); } void @@ -284,18 +293,6 @@ emit_change_signals_for_all_files (NautilusDirectory *directory) nautilus_file_list_free (files); } -static void -collect_all_directories (gpointer key, gpointer value, gpointer callback_data) -{ - NautilusDirectory *directory; - GList **dirs; - - directory = NAUTILUS_DIRECTORY (value); - dirs = callback_data; - - *dirs = g_list_prepend (*dirs, nautilus_directory_ref (directory)); -} - void emit_change_signals_for_all_files_in_all_directories (void) { |