[nautilus] shell-search-provider: Cancel metadata requests on disposal



commit 305985f209461a21be7a0017eaa603f391de2b29
Author: Marco Trevisan (Treviño) <mail 3v1n0 net>
Date:   Fri Aug 31 01:59:18 2018 +0200

    shell-search-provider: Cancel metadata requests on disposal
    
    Keep track of the nautilus_file_list_call_when_ready calls we performed
    and and stop them on disposal, returning empty values on dbus invocations.

 src/nautilus-shell-search-provider.c | 39 +++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)
---
diff --git a/src/nautilus-shell-search-provider.c b/src/nautilus-shell-search-provider.c
index b60920e9c..b65f4bebe 100644
--- a/src/nautilus-shell-search-provider.c
+++ b/src/nautilus-shell-search-provider.c
@@ -60,6 +60,7 @@ struct _NautilusShellSearchProvider
 
     PendingSearch *current_search;
 
+    GList *metas_requests;
     GHashTable *metas_cache;
 };
 
@@ -538,6 +539,7 @@ typedef struct
     NautilusShellSearchProvider *self;
 
     gint64 start_time;
+    NautilusFileListHandle *handle;
     GDBusMethodInvocation *invocation;
 
     gchar **uris;
@@ -546,6 +548,7 @@ typedef struct
 static void
 result_metas_data_free (ResultMetasData *data)
 {
+    g_clear_pointer (&data->handle, nautilus_file_list_cancel_call_when_ready);
     g_clear_object (&data->self);
     g_clear_object (&data->invocation);
     g_strfreev (data->uris);
@@ -563,11 +566,14 @@ result_metas_return_from_cache (ResultMetasData *data)
 
     g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
 
-    for (idx = 0; data->uris[idx] != NULL; idx++)
+    if (data->uris)
     {
-        meta = g_hash_table_lookup (data->self->metas_cache,
-                                    data->uris[idx]);
-        g_variant_builder_add_value (&builder, meta);
+        for (idx = 0; data->uris[idx] != NULL; idx++)
+        {
+            meta = g_hash_table_lookup (data->self->metas_cache,
+                                        data->uris[idx]);
+            g_variant_builder_add_value (&builder, meta);
+        }
     }
 
     current_time = g_get_monotonic_time ();
@@ -578,6 +584,24 @@ result_metas_return_from_cache (ResultMetasData *data)
                                            g_variant_new ("(aa{sv})", &builder));
 }
 
+static void
+result_metas_return_empty (ResultMetasData *data)
+{
+    g_clear_pointer (&data->uris, g_strfreev);
+    result_metas_return_from_cache (data);
+    result_metas_data_free (data);
+}
+
+static void
+cancel_result_meta_requests (NautilusShellSearchProvider *self)
+{
+    g_debug ("*** Cancel Results Meta requests");
+
+    g_list_free_full (self->metas_requests,
+                      (GDestroyNotify) result_metas_return_empty);
+    self->metas_requests = NULL;
+}
+
 static void
 result_list_attributes_ready_cb (GList    *file_list,
                                  gpointer  user_data)
@@ -653,6 +677,9 @@ result_list_attributes_ready_cb (GList    *file_list,
         g_free (uri);
     }
 
+    data->handle = NULL;
+    data->self->metas_requests = g_list_remove (data->self->metas_requests, data);
+
     result_metas_return_from_cache (data);
     result_metas_data_free (data);
 }
@@ -696,9 +723,10 @@ handle_get_result_metas (NautilusShellSearchProvider2  *skeleton,
 
     nautilus_file_list_call_when_ready (missing_files,
                                         NAUTILUS_FILE_ATTRIBUTES_FOR_ICON,
-                                        NULL,
+                                        &data->handle,
                                         result_list_attributes_ready_cb,
                                         data);
+    self->metas_requests = g_list_prepend (self->metas_requests, data);
     nautilus_file_list_free (missing_files);
     return TRUE;
 }
@@ -769,6 +797,7 @@ search_provider_dispose (GObject *obj)
     g_clear_object (&self->skeleton);
     g_hash_table_destroy (self->metas_cache);
     cancel_current_search_ignoring_partial_results (self);
+    cancel_result_meta_requests (self);
 
     G_OBJECT_CLASS (nautilus_shell_search_provider_parent_class)->dispose (obj);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]