diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2012-09-28 22:09:15 -0400 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2012-10-19 15:14:59 -0400 |
commit | 0177dd24a5f7f9f5302745a865eb970a35faa78c (patch) | |
tree | 44e1524b07963fd2d14b08c3afe2bed8934da18b | |
parent | 287182851b9b6de233175400eddcc5b2d63e2b4d (diff) | |
download | nautilus-0177dd24a5f7f9f5302745a865eb970a35faa78c.tar.gz |
bookmark: avoid sync I/O
-rw-r--r-- | libnautilus-private/nautilus-bookmark.c | 123 | ||||
-rw-r--r-- | libnautilus-private/nautilus-bookmark.h | 1 | ||||
-rw-r--r-- | src/nautilus-places-sidebar.c | 2 |
3 files changed, 104 insertions, 22 deletions
diff --git a/libnautilus-private/nautilus-bookmark.c b/libnautilus-private/nautilus-bookmark.c index f5995c4d7..509a8ad35 100644 --- a/libnautilus-private/nautilus-bookmark.c +++ b/libnautilus-private/nautilus-bookmark.c @@ -69,6 +69,10 @@ struct NautilusBookmarkDetails NautilusFile *file; char *scroll_file; + + gboolean exists; + guint exists_id; + GCancellable *cancellable; }; static void nautilus_bookmark_disconnect_file (NautilusBookmark *file); @@ -237,7 +241,7 @@ nautilus_bookmark_set_icon_to_default (NautilusBookmark *bookmark) g_free (uri); } - if (nautilus_bookmark_uri_known_not_to_exist (bookmark)) { + if (!bookmark->details->exists) { DEBUG ("%s: file does not exist, add emblem", nautilus_bookmark_get_name (bookmark)); apply_warning_emblem (&icon, FALSE); @@ -267,6 +271,16 @@ nautilus_bookmark_disconnect_file (NautilusBookmark *bookmark) bookmark); g_clear_object (&bookmark->details->file); } + + if (bookmark->details->cancellable != NULL) { + g_cancellable_cancel (bookmark->details->cancellable); + g_clear_object (&bookmark->details->cancellable); + } + + if (bookmark->details->exists_id != 0) { + g_source_remove (bookmark->details->exists_id); + bookmark->details->exists_id = 0; + } } static void @@ -278,7 +292,7 @@ nautilus_bookmark_connect_file (NautilusBookmark *bookmark) return; } - if (!nautilus_bookmark_uri_known_not_to_exist (bookmark)) { + if (bookmark->details->exists) { DEBUG ("%s: creating file", nautilus_bookmark_get_name (bookmark)); bookmark->details->file = nautilus_file_get (bookmark->details->location); @@ -303,6 +317,83 @@ nautilus_bookmark_connect_file (NautilusBookmark *bookmark) } } +static void +nautilus_bookmark_set_exists (NautilusBookmark *bookmark, + gboolean exists) +{ + if (bookmark->details->exists == exists) { + return; + } + + bookmark->details->exists = exists; + DEBUG ("%s: setting bookmark to exist: %d\n", + nautilus_bookmark_get_name (bookmark), exists); + + /* refresh icon */ + nautilus_bookmark_set_icon_to_default (bookmark); +} + +static gboolean +exists_non_native_idle_cb (gpointer user_data) +{ + NautilusBookmark *bookmark = user_data; + nautilus_bookmark_set_exists (bookmark, FALSE); + + return FALSE; +} + +static void +exists_query_info_ready_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GFileInfo *info; + NautilusBookmark *bookmark; + GError *error = NULL; + gboolean exists = FALSE; + + info = g_file_query_info_finish (G_FILE (source), res, &error); + if (!info && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + g_clear_error (&error); + return; + } + + g_clear_error (&error); + bookmark = user_data; + + if (info) { + exists = TRUE; + + g_object_unref (info); + g_clear_object (&bookmark->details->cancellable); + } + + nautilus_bookmark_set_exists (bookmark, exists); +} + +static void +nautilus_bookmark_update_exists (NautilusBookmark *bookmark) +{ + /* Convert to a path, returning FALSE if not local. */ + if (!g_file_is_native (bookmark->details->location) && + bookmark->details->exists_id == 0) { + bookmark->details->exists_id = + g_idle_add (exists_non_native_idle_cb, bookmark); + return; + } + + if (bookmark->details->cancellable != NULL) { + return; + } + + bookmark->details->cancellable = g_cancellable_new (); + g_file_query_info_async (bookmark->details->location, + G_FILE_ATTRIBUTE_STANDARD_TYPE, + 0, G_PRIORITY_DEFAULT, + bookmark->details->cancellable, + exists_query_info_ready_cb, bookmark); +} + /* GObject methods */ static void @@ -405,6 +496,7 @@ nautilus_bookmark_constructed (GObject *obj) NautilusBookmark *self = NAUTILUS_BOOKMARK (obj); nautilus_bookmark_connect_file (self); + nautilus_bookmark_update_exists (self); } static void @@ -471,6 +563,8 @@ nautilus_bookmark_init (NautilusBookmark *bookmark) { bookmark->details = G_TYPE_INSTANCE_GET_PRIVATE (bookmark, NAUTILUS_TYPE_BOOKMARK, NautilusBookmarkDetails); + + bookmark->details->exists = TRUE; } const gchar * @@ -708,25 +802,6 @@ nautilus_bookmark_menu_item_new (NautilusBookmark *bookmark) return menu_item; } -gboolean -nautilus_bookmark_uri_known_not_to_exist (NautilusBookmark *bookmark) -{ - char *path_name; - gboolean exists; - - /* Convert to a path, returning FALSE if not local. */ - if (!g_file_is_native (bookmark->details->location)) { - return FALSE; - } - path_name = g_file_get_path (bookmark->details->location); - - /* Now check if the file exists (sync. call OK because it is local). */ - exists = g_file_test (path_name, G_FILE_TEST_EXISTS); - g_free (path_name); - - return !exists; -} - void nautilus_bookmark_set_scroll_pos (NautilusBookmark *bookmark, const char *uri) @@ -740,3 +815,9 @@ nautilus_bookmark_get_scroll_pos (NautilusBookmark *bookmark) { return g_strdup (bookmark->details->scroll_file); } + +gboolean +nautilus_bookmark_get_exists (NautilusBookmark *bookmark) +{ + return bookmark->details->exists; +} diff --git a/libnautilus-private/nautilus-bookmark.h b/libnautilus-private/nautilus-bookmark.h index f78aef6cc..cad919870 100644 --- a/libnautilus-private/nautilus-bookmark.h +++ b/libnautilus-private/nautilus-bookmark.h @@ -72,6 +72,7 @@ GFile * nautilus_bookmark_get_location (NautilusBookmark char * nautilus_bookmark_get_uri (NautilusBookmark *bookmark); GIcon * nautilus_bookmark_get_icon (NautilusBookmark *bookmark); GIcon * nautilus_bookmark_get_symbolic_icon (NautilusBookmark *bookmark); +gboolean nautilus_bookmark_get_exists (NautilusBookmark *bookmark); gboolean nautilus_bookmark_get_has_custom_name (NautilusBookmark *bookmark); void nautilus_bookmark_set_custom_name (NautilusBookmark *bookmark, const char *new_name); diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c index 9236dbd89..6fc90ae72 100644 --- a/src/nautilus-places-sidebar.c +++ b/src/nautilus-places-sidebar.c @@ -767,7 +767,7 @@ update_places (NautilusPlacesSidebar *sidebar) for (index = 0; index < bookmark_count; ++index) { bookmark = nautilus_bookmark_list_item_at (sidebar->bookmarks, index); - if (nautilus_bookmark_uri_known_not_to_exist (bookmark)) { + if (!nautilus_bookmark_get_exists (bookmark)) { continue; } |