dbus_bus_get refcounting
Timo Hoenig
thoenig at suse.de
Sun May 21 03:57:24 PDT 2006
(cc'ing Holger as we've recently discussed this; he is off-list.)
Hi,
On Sat, 2006-05-20 at 21:49 -0400, Havoc Pennington wrote:
> I may be missing something since this seems like an obvious bug:
> dbus_bus_get() docs claim it returns a reference. However, you can't
> possibly call unref() because you can only call unref() on a connection
> if you either a) know it's been disconnected or b) know you don't have
> the only outstanding ref to it. For dbus_bus_get() these are more or
> less impossible right now.
>
> The obvious simple hello world prints warnings:
> connection = dbus_bus_get();
> /* do stuff */
> dbus_connection_unref(connection);
>
> NetworkManager seems to have as a workaround only unref'ing on the
> disconnect message...
That was not meant to be a workaround.
That is how I got used to fix up applications suffering from not being
able to recover after D-BUS disconnects: First unref the dead
connection, only then dare to request a new. As I did not have a look
at the D-BUS side of things for this I expected this to be the intended
way.
> Obviously I messed this up in the first place but it seems pretty lame
> to me now.
>
> I think the right fix is to leave dbus_bus_get() returning a ref, but
> have it also hold a strong ref internally instead of a weak ref. Then
> you can know it's safe to unref this connection since the
> internal-to-dbus strong ref is held until it's disconnected.
Agreed. If there was no requirement on having applications to call
dbus_connection_unref() this sounds definitely like a the way to fix
this issue.
> Havoc
Timo
More information about the dbus
mailing list