[gnome-software/wip/mak/libas: 2/12] lib: Cache GsOsRelease




commit b1ae521a40ce660e4038e268e47cf4dd1caa1efd
Author: Philip Withnall <pwithnall endlessos org>
Date:   Mon Jan 4 18:22:52 2021 +0000

    lib: Cache GsOsRelease
    
    The data in `/etc/os-release` isn’t going to change at runtime, and
    various parts of gnome-software refer to it often. In particular,
    `gs_plugin_check_distro_id()` is called quite a lot.
    
    Cache the parsed OS release information, so gnome-software doesn’t keep
    opening and re-parsing `/etc/os-release`.
    
    Signed-off-by: Philip Withnall <pwithnall endlessos org>
    
    Fixes: #1116

 lib/gs-os-release.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)
---
diff --git a/lib/gs-os-release.c b/lib/gs-os-release.c
index 305c5bbae..191a38533 100644
--- a/lib/gs-os-release.c
+++ b/lib/gs-os-release.c
@@ -320,16 +320,28 @@ gs_os_release_init (GsOsRelease *os_release)
  * gs_os_release_new:
  * @error: a #GError, or %NULL
  *
- * Creates a new os_release.
+ * Returns a new reference to a #GsOsRelease. The information may be cached.
  *
- * Returns: (transfer full): A newly allocated #GsOsRelease, or %NULL for error
+ * Returns: (transfer full): A new reference to a #GsOsRelease, or %NULL for error
  *
  * Since: 3.22
  **/
 GsOsRelease *
 gs_os_release_new (GError **error)
 {
-       GsOsRelease *os_release;
-       os_release = g_initable_new (GS_TYPE_OS_RELEASE, NULL, error, NULL);
-       return GS_OS_RELEASE (os_release);
+       static gsize initialised = 0;
+       static GsOsRelease *os_release = NULL;
+       static GError *os_release_error = NULL;
+
+       if (g_once_init_enter (&initialised)) {
+               os_release = g_initable_new (GS_TYPE_OS_RELEASE, NULL, &os_release_error, NULL);
+               g_once_init_leave (&initialised, 1);
+       }
+
+       if (os_release != NULL) {
+               return g_object_ref (os_release);
+       } else {
+               g_propagate_error (error, g_error_copy (os_release_error));
+               return NULL;
+       }
 }


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