summaryrefslogtreecommitdiff
path: root/gio/gsettingsbackend.c
diff options
context:
space:
mode:
authorPhilip Withnall <withnall@endlessm.com>2019-01-23 16:07:51 +0000
committerPhilip Withnall <pwithnall@endlessos.org>2021-01-20 12:51:41 +0000
commit22b924b64acaefed51a103f2f4a5ad09048183ed (patch)
treea4a2c7df071e9d27e95d94ca1c5bb3ce01d76c12 /gio/gsettingsbackend.c
parentb2079656972b5e7098f0d28bbba3a39fa4a62d16 (diff)
giomodule: Don’t mandatorily cache GIOModule implementations
While all of the current callers of _g_io_module_get_default() want to cache the returned GObject for the lifetime of the process, that doesn’t necessarily have to be the case, so let callers make that decision on a case-by-case basis. Signed-off-by: Philip Withnall <withnall@endlessm.com>
Diffstat (limited to 'gio/gsettingsbackend.c')
-rw-r--r--gio/gsettingsbackend.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/gio/gsettingsbackend.c b/gio/gsettingsbackend.c
index dcc7c3714..b124bc7ec 100644
--- a/gio/gsettingsbackend.c
+++ b/gio/gsettingsbackend.c
@@ -992,6 +992,12 @@ g_settings_backend_verify (gpointer impl)
return TRUE;
}
+/* We need to cache the default #GSettingsBackend for the entire process
+ * lifetime, especially if the backend is #GMemorySettingsBackend: it needs to
+ * keep the in-memory settings around even while there are no #GSettings
+ * instances alive. */
+static GSettingsBackend *settings_backend_default_singleton = NULL; /* (owned) (atomic) */
+
/**
* g_settings_backend_get_default:
*
@@ -1010,12 +1016,18 @@ g_settings_backend_verify (gpointer impl)
GSettingsBackend *
g_settings_backend_get_default (void)
{
- GSettingsBackend *backend;
+ if (g_once_init_enter (&settings_backend_default_singleton))
+ {
+ GSettingsBackend *singleton;
+
+ singleton = _g_io_module_get_default (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME,
+ "GSETTINGS_BACKEND",
+ g_settings_backend_verify);
+
+ g_once_init_leave (&settings_backend_default_singleton, singleton);
+ }
- backend = _g_io_module_get_default (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME,
- "GSETTINGS_BACKEND",
- g_settings_backend_verify);
- return g_object_ref (backend);
+ return g_object_ref (settings_backend_default_singleton);
}
/*< private >