Integrating a DBus listener with libevent framework
Simon McVittie
simon.mcvittie at collabora.co.uk
Wed Jan 18 13:43:12 UTC 2017
On Tue, 23 Aug 2016 at 16:31:31 -0600, Philip Prindeville wrote:
> Most of the examples I've looked at for DBus were based on a main loop that
> DBus would consume messages and invoke its handler.
>
> In this case, the daemon is single-threaded but event-driven (via libevent)
> since none of the handling of the events ever requires any sort of blocking.
I replied to <https://bugs.freedesktop.org/show_bug.cgi?id=99002>, but
replying here too for completeness.
You would need to write a glue layer that calls
dbus_connection_set_dispatch_status_function(),
dbus_connection_set_watch_functions(), etc., similar to
https://cgit.freedesktop.org/dbus/dbus/tree/test/test-utils.c, but uses
libevent instead of the internal DBusLoop.
There are various examples of people doing this:
* the simple (non-thread-safe) internal main-loop in dbus/dbus-loop.[ch]
and dbus/dbus-socket-set*
* the multiple main-loop integration layers in Avahi
* the GLib main-loop integration layer in dbus-glib
* the Qt main-loop integration layer in QtDBus
* the Enlightenment main-loop integration layer in
https://git.enlightenment.org/legacy/bindings/python/python-e_dbus.git/
As you can infer from those, these main-loop integration layers
are usually out-of-tree, and there is enough public API to write one.
I am not going to merge a libevent integration layer into the dbus
core source tree unless I can be confident that someone will maintain
it forever (which seems unlikely). I'm keen to keep dbus/libdbus to
what the reference implementation needs, and no more. However, if someone
who likes libevent releases a third-party libevent integration layer,
I'd be happy to link to it from documentation.
I should warn you that trying to follow a "simplest possible" example is
potentially counter-productive: real, production-ready integration with a
main loop is going to have to do more or less everything that the GLib and
Qt ones do, except obviously using libevent instead of GLib or Qt.
Regards,
S
More information about the dbus
mailing list