diff options
author | Philip Withnall <withnall@endlessm.com> | 2019-01-23 16:07:51 +0000 |
---|---|---|
committer | Philip Withnall <pwithnall@endlessos.org> | 2021-01-20 12:51:41 +0000 |
commit | 22b924b64acaefed51a103f2f4a5ad09048183ed (patch) | |
tree | a4a2c7df071e9d27e95d94ca1c5bb3ce01d76c12 /gio/gsettingsbackend.c | |
parent | b2079656972b5e7098f0d28bbba3a39fa4a62d16 (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.c | 22 |
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 > |