Monitoring lifetimes with Python bindings
Ole Laursen
olau at hardworking.dk
Thu Jul 7 23:02:52 EST 2005
Havoc Pennington <hp at redhat.com> writes:
> On Wed, 2005-07-06 at 16:45 -0400, John (J5) Palmieri wrote:
>> @dbus.explicitly_pass_message is mainly for debugging. Messages should
>> not be exposed in the python bindings. The best thing to do is for your
>> client to send its unique name to the server when it connects to the bus
>> and register the NameOwnerChanged signal with sender equal to the name
>> you received. You can also use the GetNameOwner call to get the unique
>> name of an already running process.
>
> I think exposing messages would be wrong but exposing the caller of a
> method may not be if we could figure out a good approach.
Perhaps one possibility would be to use another decorator, e.g.
@dbus.pass_sender, which would pass a Sender object. Sender could then
expose get_name() to return the unique name and a disappeared() hook
that you can connect to. The disappeared() hook would then internally
register with the NameOwnerChanged signal and also call GetNameOwner
to avoid the race condition.
Does this sound like a good idea?
Perhaps something like the following snippet (I'm not a Python
expert, but it appears to work):
class Sender:
def __init__(self, unique_name, bus):
self.unique_name = unique_name
self.bus = bus
def get_name(self):
"""Return the unique name of the sender."""
return self.unique_name
def register_disappeared_handler(self, disappear_handler, error_handler):
"""Register a handler which is called when sender disappears."""
self.disappear_handler = disappear_handler
self.error_handler = error_handler
self.disappear_handler_called = False
bus_obj = self.bus.get_object("org.freedesktop.DBus",
"/org/freedesktop/DBus")
bus_obj.connect_to_signal("NameOwnerChanged",
self._name_owner_changed_handler,
dbus_interface="org.freedesktop.DBus")
bus_obj.NameHasOwner(self.unique_name,
reply_handler = self._name_has_owner_reply,
error_handler = error_handler,
dbus_interface = "org.freedesktop.DBus")
def _name_owner_changed_handler(self, name, old_name, new_name):
if old_name == self.unique_name and new_name == "":
if not self.disappear_handler_called:
self.disappear_handler_called = True
self.disappear_handler()
def _name_has_owner_reply(self, has_name):
if not has_name:
if not self.disappear_handler_called:
self.disappear_handler_called = True
self.disappear_handler()
--
Ole Laursen
http://www.cs.aau.dk/~olau/
More information about the dbus
mailing list