[gnome-software/wip/mak/libas: 2/12] lib: Cache GsOsRelease
- From: Matthias Klumpp <mak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/mak/libas: 2/12] lib: Cache GsOsRelease
- Date: Tue, 12 Jan 2021 17:22:09 +0000 (UTC)
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]