[gnome-software/630-flatpak-updates-are-stuck-in-installing-state-when-flatpak-update-was-already-done-outside: 102/103] gs-flatpak: Use preloaded list of installed references in gs_flatpak_ref_to_app()




commit 93249152d30558ccc9731c778b49553e3bcdfbb3
Author: Milan Crha <mcrha redhat com>
Date:   Mon Mar 22 10:43:36 2021 +0100

    gs-flatpak: Use preloaded list of installed references in gs_flatpak_ref_to_app()
    
    This might make it quicker than asking for the list of installed references
    every time the function is called.

 plugins/flatpak/gs-flatpak.c | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)
---
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
index 9b0484dff..3ab980426 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -1343,25 +1343,33 @@ gs_flatpak_ref_to_app (GsFlatpak *self, const gchar *ref,
                       GCancellable *cancellable, GError **error)
 {
        g_autoptr(GPtrArray) xremotes = NULL;
-       g_autoptr(GPtrArray) xrefs = NULL;
 
        g_return_val_if_fail (ref != NULL, NULL);
 
-       /* get all the installed apps (no network I/O) */
-       xrefs = flatpak_installation_list_installed_refs (self->installation,
-                                                         cancellable,
-                                                         error);
-       if (xrefs == NULL) {
-               gs_flatpak_error_convert (error);
-               return NULL;
+       g_mutex_lock (&self->installed_refs_mutex);
+
+       if (self->installed_refs == NULL) {
+               self->installed_refs = flatpak_installation_list_installed_refs (self->installation,
+                                                                cancellable, error);
+
+               if (self->installed_refs == NULL) {
+                       g_mutex_unlock (&self->installed_refs_mutex);
+                       gs_flatpak_error_convert (error);
+                       return NULL;
+               }
        }
-       for (guint i = 0; i < xrefs->len; i++) {
-               FlatpakInstalledRef *xref = g_ptr_array_index (xrefs, i);
+
+       for (guint i = 0; i < self->installed_refs->len; i++) {
+               FlatpakInstalledRef *xref = g_ptr_array_index (self->installed_refs, i);
                g_autofree gchar *ref_tmp = flatpak_ref_format_ref (FLATPAK_REF (xref));
-               if (g_strcmp0 (ref, ref_tmp) == 0)
+               if (g_strcmp0 (ref, ref_tmp) == 0) {
+                       g_mutex_unlock (&self->installed_refs_mutex);
                        return gs_flatpak_create_installed (self, xref, NULL, cancellable);
+               }
        }
 
+       g_mutex_unlock (&self->installed_refs_mutex);
+
        /* look at each remote xref */
        xremotes = flatpak_installation_list_remotes (self->installation,
                                                      cancellable, error);


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