Hi; On 5 February 2017 at 12:51, Gábor Csárdi <csardi.gabor+gtk-list@xxxxxxxxx> wrote: > Thanks! R is single threaded and synchronous (focus is computation, not > I/O), so I don't need threaded code at all. Okay; just remember this in case you need to do asynchronous work. > Btw. I could also just have a dbus client using TCP/IP, right? No. The support for unauthenticated TCP connections is meant for private connections, which means you would not be able to access the session bus where the secrets manager lives. You'd need a special system configuration to allow TCP connections to the session bus, but it's *strongly* discouraged to do so, unless you want third parties to listen in to everything that gets sent through the bus. Ciao, Emmanuele. > Gabor > > On Sun, Feb 5, 2017 at 11:36 AM, Emmanuele Bassi <ebassi@xxxxxxxxx> wrote: >> >> Yes. Libdbus is a fairly low level API and has known limitations for >> threaded code. It's the reference implementation of the DBus specification, >> and as such it should only be used if nothing else is available. >> >> Ciao, >> Emmanuele. >> >> On Sun, 5 Feb 2017 at 10:51, Gábor Csárdi >> <csardi.gabor+gtk-list@xxxxxxxxx> wrote: >>> >>> Thanks much, this saves me from a lot of trouble! >>> >>> I'll look at libdbus. That's probably a lot more work, I'll need to >>> implement a small libsecret client, right? >>> >>> Thanks, >>> Gabor >>> >>> On Sun, Feb 5, 2017 at 10:36 AM, Emmanuele Bassi <ebassi@xxxxxxxxx> >>> wrote: >>>> >>>> Hi; >>>> >>>> You cannot ever unload libgobject - and any other gobject based >>>> libraries - with dlclose() after dlopen()-ing them. The type system cannot >>>> be reset on library unload, and thus types that were registered once will >>>> still be alive the next time you load the library. Additionally, GLib and >>>> GObject and GIO have threads and additional state created for things like >>>> GDBus, which libsecret uses internally to talk to the secrets service. >>>> >>>> In short: if you want to have a plugin that talks to the password and >>>> secret storage through the Secret Service DBus API, you will have to use a >>>> library that allows unloading and reloading; likely only libdbus. >>>> Alternatively, do not allow disabling the plugin if you want to use >>>> libsecret. >>>> >>>> Ciao, >>>> Emmanuele. >>>> >>>> On Sun, 5 Feb 2017 at 10:27, Gábor Csárdi >>>> <csardi.gabor+gtk-list@xxxxxxxxx> wrote: >>>>> >>>>> 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 >>>>> _______________________________________________ >>>>> gtk-list mailing list >>>>> gtk-list@xxxxxxxxx >>>>> https://mail.gnome.org/mailman/listinfo/gtk-list >>>> >>>> -- >>>> https://www.bassi.io >>>> [@] ebassi [@gmail.com] >>> >>> >> -- >> https://www.bassi.io >> [@] ebassi [@gmail.com] > > -- https://www.bassi.io [@] ebassi [@gmail.com] _______________________________________________ gtk-list mailing list gtk-list@xxxxxxxxx https://mail.gnome.org/mailman/listinfo/gtk-list