Re: Running dbus_connection_read_write_dispatch in a separate thread

Alexandru Sorodoc <[email protected]>
Newsgroups gmane.comp.freedesktop.dbus
Message-ID <[email protected]>
Thanks for the reply. I completely understand what using libdbus 
implies, and I will eventually integrate this with libevent. But for now 
I just want an implementation as simple as possible to validate the 
functionality that I want to implement before going further. I conceded 
to run read_write_dispatch with a 1-second timeout, it's good enough for 
now. Thanks again.

On 6/18/20 7:26 PM, Simon McVittie wrote:
> Expanding on that: read_write_dispatch is a simple solution for
> single-threaded D-Bus clients like dbus-monitor, and is not really
> fit-for-purpose in something with multiple threads.
>
> Using a real main-loop framework (GLib's main loop, Qt's main loop,
> libevent, libev, that sort of thing) is likely to be better-tested than
> making your own artisanal dispatcher. Unfortunately, libdbus tries to
> be all things to all people, so it half-supports all main loops and no
> main loop equally, rather than fully supporting one and rejecting all
> the others.
>
> The libdbus API documentation has some wise words about libdbus which
> probably apply here:
>
>      This manual documents the *low-level* D-Bus C API. **If you use this
>      low-level API directly, you're signing up for some pain.**
>
> I think the key thing for interrupting the main loop is likely to be
> dbus_connection_set_wakeup_main_function(), which needs to be called
> providing a callback that will wake up the dispatching thread's poll()
> (or equivalent).
>
> For example,
> https://gitlab.freedesktop.org/dbus/dbus-glib/-/tree/dbus-gmain
> is a fairly complete example of integrating libdbus
> with the GLib main loop. The callback that it passes to
> dbus_connection_set_wakeup_main_function() uses g_main_context_wakeup()
> to wake up the central poll() call in GLib. Historically
> g_main_context_wakeup() was implemented as a pipe-to-self, and recent
> versions optimize that by using an eventfd on Linux.
>
> If "pipe-to-self" means nothing to you, then implementing your own event
> loop is probably going to require more learning than would be productive
> or efficient.
>
> You could also consider using a different D-Bus implementation instead
> of libdbus. GDBus (part of GLib) is specifically designed to be able
> to share a single D-Bus connection between multiple threads, by using
> GLib's GMainContext abstraction for threading and dispatching, and doing
> the actual I/O in its own private thread.
>
> I would normally also suggest systemd's sd-bus, but sd-bus is specifically
> not multi-threaded, so probably not that one for your use-case.
>
> Having all your D-Bus I/O happen in one designated thread, and making
> all other threads that want to use D-Bus post messages to/from the D-Bus
> thread instead of touching D-Bus APIs directly, is another possible route;
> libdbus and sd-bus work well with that approach. This is close to how
> GDBus works behind the scenes.
>
> Regards,
>      smcv
> _______________________________________________
> dbus mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/dbus

_______________________________________________
dbus mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dbus
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.