libsecret and dlopen/dlclose thread cleanup, dlopen freeze
- From: Gábor Csárdi <csardi gabor+gtk-list gmail com>
- To: gtk-list gnome org
- Subject: libsecret and dlopen/dlclose thread cleanup, dlopen freeze
- Date: Sun, 5 Feb 2017 10:27:35 +0000
Hi all,
I have a plugin that uses libsecret, and thus glib, on Linux. (It is a package for R.)
It is loaded with dlopen(), and it (ideally) can be unloaded with dlclose(). I use the synchronous libsecret functions, which AFAICT run a temporary glib event loop for each libsecret query. E.g. this is what I am doing:
GError *err = NULL;
gchar *password = secret_password_lookup_sync (
keyring_secret_service_schema(),
/* cancellable = */ NULL,
&err,
"service", cservice,
"username", cusername,
NULL);
if (err) {
if (password) secret_password_free(password);
keyring_secret_service_handle_status("get", TRUE, err);
}
if (!password) {
error("keyring item not found");
return R_NilValue;
} else {
secret_password_free(password);
/* ... */
return result;
}
When the lib is unloaded I call secret_service_disconnect(), I checked that this is called. I do link to libgobject-2.0, I even call g_type_ensure (G_TYPE_OBJECT) to make sure that the constructors in libgobject run.
However, it seems that the worker threads for glib (?) are never cleaned up. Even if I dlclose() the lib, they are there. What am I missing here? Do I have to eliminate the threads manually? If yes, how can I do that?
An even bigger problem is, that if I dlopen() the same plugin again, and call a libsecret function, then it just freezes with this:
(process:18663): GLib-GObject-WARNING **: cannot register existing type 'SecretService'
(process:18663): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed
(process:18663): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed
(process:18663): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
(process:18663): GLib-GIO-CRITICAL **: g_async_initable_new_valist_async: assertion 'G_TYPE_IS_ASYNC_INITABLE (object_type)' failed
Which seems to suggest that I need to unregister the SecretService type at dlclose(). Is that right? How can I do that?
I don't have too much experience with glib, and I am just probably doing something wrong, or missing something. Any help is appreciated. I can also put together a reproducible example if needed.
Thanks, Best,
Gabor
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]