using dbus in the platform

Havoc Pennington hp at redhat.com
Tue Oct 16 12:25:22 PDT 2007


Hi,

The concerns you raised are:

  - multiple implementations of dbus protocol are extra overhead
  - multiple connections to the bus from a single process are extra
    overhead
  - multiple connections may be confusing semantically

Well, there is a proposal on the table to avoid multiple connections: 
that is for everyone to share the same DBusConnection object from libdbus.

As I understand your proposal, it is to allow each app to provide its 
own "gtk-to-dbus bridge" to GTK+ at runtime, with the idea being that a 
C# app would provide such a bridge written in C#, and a Python app would 
provide one written in Python, and so forth.

Unfortunately, a gtk-to-dbus bridge will simply be a dbus library. gvfs 
*also* uses dbus in arbitrary ways, and GTK will potentially use dbus in 
arbitrary ways. So, a gvfs/gtk-to-dbus bridge would be a complete C dbus 
API, not some limited API.

So what your proposal boils down to is to have a complete C dbus API, 
with a pluggable protocol parser and connection queue on the backend 
that can be written in any language.

Alp Toker wrote:
> The ideas being thrown about involved pre-loading a module that would 
> provide IPC functionality, rather than a hard-coded dependency on D-Bus.

To make this more concrete, see the patch I posted with GtkDesktop.
http://mail.gnome.org/archives/gtk-devel-list/2007-October/msg00025.html

(the use of dbus is not coded yet, though, but it should be obvious 
where it would slot in)

> The functionality is welcome, but it should be provided in a separate 
> library, just like gvfs.
> 
> Is there any technical reason why it needs to be included in GTK+? Does 
> it make use of GTK+ internals? I suspect not.

gvfs and gtk need to *depend* on being able to use dbus. That means they 
have to depend on a dbus C API. Now, the dbus C API could be a wrapper 
around a pluggable dbus implementation written in Python, C#, or 
whatever; but, I don't understand why that makes sense at all. It is 
backward from how we do language bindings in every other case.

The reason we do language bindings with everything else wrapping C, 
instead of vice versa, is to avoid implementing everything N times, once 
per language.

> libdbus was not well-suited to language binding when I reviewed its 
> documentation.

Well, you should ask questions. All problems I know of are either 
fixable, or due to a misunderstanding of how to use the API.

For example, people had issues with reference count cycles. This is an 
already-solved problem with GObject, using toggle references. As soon as 
someone asked about the issue, I knew about the GObject solution and was 
able to suggest it for libdbus.

Another example, you mention the abort behavior on violations of the API 
contract; GTK has the same behavior, you know, though it does not abort 
by default, behavior is undefined by default once the API contract is 
violated, and can be configured via env variable to abort. libdbus 
aborts by default, but can be configured via env variable to have 
undefined behavior instead.

You should not be shipping code that *either* aborts or triggers 
undefined behavior.

For *both* GTK and libdbus, it is a bug in a binding if these API 
contract violations are triggered. In both cases, there is no way to 
throw a C# or Python exception due to triggering them. If you want to 
throw an exception you have to catch *and avoid* the API contract 
violation prior to calling in to GTK or libdbus. The fact that GTK is 
undefined instead of aborting immediately does not mean it is OK to 
violate the API contract.

(This of course is exactly why libdbus aborts, because with the GTK 
behavior people think it is somehow more permissible not to fix their 
code. The libdbus way is intended to force you to understand the 
difference between an API contract violation and a recoverable error, 
which is also documented in the GLib manual: 
http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html 
and I tried another way to explain it here: 
http://lists.freedesktop.org/archives/dbus/2007-October/008680.html)

I don't think you understand the distinction here and what the libdbus 
and GTK API contracts are, because if you did, you would not see a 
difference in your responsibilities when binding libdbus and binding GTK.

If you do think undefined behavior is somehow OK, then set the env 
variable when using libdbus to turn off abort and turn on undefined 
behavior. You can even do a putenv() in your binding, though I think 
that's pretty strange.

In any case, another branch of this thread (on dbus list only) already 
discussed solving this problem. The solution includes 1) it is a bug if 
libdbus has API contract violations that you can't avoid or have to 
write tons of code to avoid and 2) we can have a convenience API shared 
by language bindings that does more precondition checks, if people want.
There is no reason, bottom line, that you should ever trigger an API 
contract violation.

You briefly refer to "necessary entry points for
marshalling/demarshalling data" and "encouraged consumers to disconnect 
shared connections"; I am not sure what either of those mean, but if you 
want to post a description of the problems I am happy to either clarify 
how to use the API or fix it.

> If "DBusConnection" is so easily shared, why are various language 
> bindings today opening private, unshared connections to the bus? It is 
> evident that reality has not matched expectations here.

And you think having gvfs and gtk use a C dbus API that has pluggable 
backend implementations written in 5 different languages is going to help?

dbus-glib does not use a private connection. QtDBus did, but as 
discussed in earlier threads, it did not have to; the issue was that 
Thiago did not fully understand how to use the libdbus API. (And now it 
would be some work to retroactively adjust how QtDBus works.) I am not 
sure of the current dbus python status on this, but I don't remember 
hearing any good reason it could not use the shared connection. All I 
remember were some bugs or missing API or other easily-fixable item.

The fact is that addressing any shared connection issues is easy, much 
easier than the alternatives, and that problems with it in the past have 
been due either to bugs or misunderstandings.

> In my experience with libdbus, I've found that it sets low standards for 
> interoperability and fails to achieve them.

All of the problems you have mentioned specifically are simple problems. 
Inventing a whole new C dbus API that *wraps* multiple APIs written in 
other languages is *not* a simple problem.

> Given these realities, I cannot see how libdbus in its current state 
> could be an appropriate dependency for GTK+.

I don't think saying "realities" is accurate at all. libdbus uses pretty 
much exactly the same API conventions as the rest of the GLib/GTK+ stack.

Havoc



More information about the dbus mailing list