diff options
author | Alexander Larsson <alexl@redhat.com> | 2005-09-06 15:12:46 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2005-09-06 15:12:46 +0000 |
commit | b32d6453ad9063fb95e50d3b1fd2fbcbfea42ae8 (patch) | |
tree | d964acfc905028e520bfe81d4fb37086e4d3dca9 | |
parent | 5f2794aed462ea2b1a467b2d2a48621315059891 (diff) | |
download | nautilus-b32d6453ad9063fb95e50d3b1fd2fbcbfea42ae8.tar.gz |
Only use directory monitors to avoid using lots and lots of file monitors.
2005-09-06 Alexander Larsson <alexl@redhat.com>
* libnautilus-private/nautilus-directory-async.c:
(nautilus_directory_monitor_add_internal),
(nautilus_directory_monitor_remove_internal):
* libnautilus-private/nautilus-file-private.h:
* libnautilus-private/nautilus-file.c: (finalize):
Only use directory monitors to avoid using lots and lots of
file monitors. This is an optimization in almost all cases, although
it does a bit more work when viewing a file properties dialog with the
containing folder window hidden. (#315041)
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-async.c | 62 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-private.h | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file.c | 4 |
4 files changed, 22 insertions, 58 deletions
@@ -1,3 +1,15 @@ +2005-09-06 Alexander Larsson <alexl@redhat.com> + + * libnautilus-private/nautilus-directory-async.c: + (nautilus_directory_monitor_add_internal), + (nautilus_directory_monitor_remove_internal): + * libnautilus-private/nautilus-file-private.h: + * libnautilus-private/nautilus-file.c: (finalize): + Only use directory monitors to avoid using lots and lots of + file monitors. This is an optimization in almost all cases, although + it does a bit more work when viewing a file properties dialog with the + containing folder window hidden. (#315041) + 2005-09-06 Christian Neumair <chris@gnome-de.org> * src/file-manager/fm-directory-view.c: (add_extension_menu_items), diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index a3288c3b5..7d7f1d5c5 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -479,35 +479,6 @@ find_monitor (NautilusDirectory *directory, monitor_key_compare); } -static int -monitor_file_compare (gconstpointer a, - gconstpointer data) -{ - const Monitor *monitor; - NautilusFile *file; - - monitor = a; - file = (NautilusFile *) data; - - if (monitor->file < file) { - return -1; - } - if (monitor->file > file) { - return +1; - } - - return 0; -} - -static gboolean -find_any_monitor (NautilusDirectory *directory, - NautilusFile *file) -{ - return g_list_find_custom (directory->details->monitor_list, - file, - monitor_file_compare) != NULL; -} - static void remove_monitor_link (NautilusDirectory *directory, GList *link) @@ -623,7 +594,6 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory, { Monitor *monitor; GList *file_list; - char *file_uri; g_assert (NAUTILUS_IS_DIRECTORY (directory)); @@ -649,16 +619,12 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory, } /* Start the "real" monitoring (FAM or whatever). */ - if (file == NULL) { - if (directory->details->monitor == NULL) { - directory->details->monitor = nautilus_monitor_directory (directory->details->uri); - } - } else { - if (file->details->monitor == NULL) { - file_uri = nautilus_file_get_uri (file); - file->details->monitor = nautilus_monitor_file (file_uri); - g_free (file_uri); - } + /* We always monitor the whole directory since in practice + * nautilus almost always shows the whole directory anyway, and + * it allows us to avoid one file monitor per file in a directory. + */ + if (directory->details->monitor == NULL) { + directory->details->monitor = nautilus_monitor_directory (directory->details->uri); } /* We could just call update_metadata_monitors here, but we can be smarter @@ -1129,18 +1095,10 @@ nautilus_directory_monitor_remove_internal (NautilusDirectory *directory, remove_monitor (directory, file, client); - if (file == NULL) { - if (directory->details->monitor != NULL - && !find_any_monitor (directory, NULL)) { - nautilus_monitor_cancel (directory->details->monitor); - directory->details->monitor = NULL; - } - } else { - if (file->details->monitor != NULL - && !find_any_monitor (directory, file)) { - nautilus_monitor_cancel (file->details->monitor); - file->details->monitor = NULL; - } + if (directory->details->monitor != NULL + && directory->details->monitor_list == NULL) { + nautilus_monitor_cancel (directory->details->monitor); + directory->details->monitor = NULL; } update_metadata_monitors (directory); diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h index 7c28be9e1..24466f8ab 100644 --- a/libnautilus-private/nautilus-file-private.h +++ b/libnautilus-private/nautilus-file-private.h @@ -65,8 +65,6 @@ struct NautilusFileDetails GnomeVFSFileInfo *info; GnomeVFSResult get_info_error; - NautilusMonitor *monitor; - guint directory_count; guint deep_directory_count; diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c index d7e68b26b..89a285b4b 100644 --- a/libnautilus-private/nautilus-file.c +++ b/libnautilus-private/nautilus-file.c @@ -471,10 +471,6 @@ finalize (GObject *object) g_free (uri); } - if (file->details->monitor != NULL) { - nautilus_monitor_cancel (file->details->monitor); - } - nautilus_async_destroying_file (file); remove_from_link_hash_table (file); |