summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaiki Ueno <dueno@src.gnome.org>2019-07-01 17:29:10 +0200
committerDaiki Ueno <ueno@gnu.org>2019-10-08 07:55:55 +0000
commitb37d2b8d201e9c6095ead8310fa5b416b75682db (patch)
tree9d5bd960d9a1ed7621d4a98a6b674a90769fdcd6
parent71a19a95aec406104d6231126d6178b1392551ff (diff)
downloadlibsecret-b37d2b8d201e9c6095ead8310fa5b416b75682db.tar.gz
secret-backend: Add a way to uncache singleton instance
This is ugly, but necessary to handle instance uncaching in SecretBackend when the backend instance is gone.
-rw-r--r--libsecret/secret-backend.c14
-rw-r--r--libsecret/secret-backend.h2
-rw-r--r--libsecret/secret-service.c2
3 files changed, 18 insertions, 0 deletions
diff --git a/libsecret/secret-backend.c b/libsecret/secret-backend.c
index 2c26c7d..a63b75c 100644
--- a/libsecret/secret-backend.c
+++ b/libsecret/secret-backend.c
@@ -122,6 +122,20 @@ backend_get_instance (void)
return instance;
}
+void
+_secret_backend_uncache_instance (void)
+{
+ SecretBackend *instance = NULL;
+
+ G_LOCK (backend_instance);
+ instance = backend_instance;
+ backend_instance = NULL;
+ G_UNLOCK (backend_instance);
+
+ if (instance != NULL)
+ g_object_unref (instance);
+}
+
static GType
backend_get_impl_type (void)
{
diff --git a/libsecret/secret-backend.h b/libsecret/secret-backend.h
index 7dae506..3dadffa 100644
--- a/libsecret/secret-backend.h
+++ b/libsecret/secret-backend.h
@@ -97,6 +97,8 @@ struct _SecretBackendInterface
void _secret_backend_ensure_extension_point
(void);
+void _secret_backend_uncache_instance
+ (void);
void secret_backend_get (SecretBackendFlags flags,
GCancellable *cancellable,
diff --git a/libsecret/secret-service.c b/libsecret/secret-service.c
index 95498a6..36d2feb 100644
--- a/libsecret/secret-service.c
+++ b/libsecret/secret-service.c
@@ -191,6 +191,8 @@ service_uncache_instance (SecretService *which)
if (watch != 0)
g_bus_unwatch_name (watch);
+ _secret_backend_uncache_instance ();
+
return matched;
}