Siegfried Gevatter has proposed merging lp:~zeitgeist/zeitgeist/dbus-paranoia
into lp:zeitgeist.
Requested reviews:
Zeitgeist Framework Team (zeitgeist)
Related bugs:
Bug #732015 in zeitgeist (Ubuntu): zeitgeist-daemon crashed with
NameExistsException in __new__(): Bus name already exists:
org.gnome.zeitgeist.Engine
https://bugs.launchpad.net/ubuntu/+source/zeitgeist/+bug/732015
For more details, see:
https://code.launchpad.net/~zeitgeist/zeitgeist/dbus-paranoia/+merge/53301
--
https://code.launchpad.net/~zeitgeist/zeitgeist/dbus-paranoia/+merge/53301
Your team Zeitgeist Framework Team is requested to review the proposed merge of
lp:~zeitgeist/zeitgeist/dbus-paranoia into lp:zeitgeist.
=== modified file '_zeitgeist/singleton.py'
--- _zeitgeist/singleton.py 2011-01-17 15:54:47 +
+++ _zeitgeist/singleton.py 2011-03-14 19:04:52 +
@@ -19,12 +19,13 @@
# along with this program. If not, see http://www.gnu.org/licenses/.
import logging
-import sys
import dbus
from zeitgeist.client import ZeitgeistDBusInterface
from zeitgeist import _config
+log = logging.getLogger(singleton)
+
class SingletonApplication (dbus.service.Object):
Base class for singleton applications and dbus services.
@@ -34,37 +35,52 @@
def __init__ (self):
- logging.debug(Checking for another running instance...)
- sbus = dbus.SessionBus()
- dbus_service = sbus.get_object(org.freedesktop.DBus, /org/freedesktop/DBus)
+ log.debug(Checking for another running instance...)
+ self._session_bus = dbus.SessionBus()
+ self._dbus_service = self._session_bus.get_object(org.freedesktop.DBus,
+ /org/freedesktop/DBus)
- if dbus_service.NameHasOwner(ZeitgeistDBusInterface.BUS_NAME):
+ if self._dbus_service.NameHasOwner(ZeitgeistDBusInterface.BUS_NAME):
# already running daemon instance
- if hasattr(_config, options) and (_config.options.replace or _config.options.quit):
-if _config.options.quit:
- logging.info(Stopping the currently running instance.)
-else:
- logging.debug(Replacing currently running process.)
-interface = ZeitgeistDBusInterface()
-interface.Quit()
-while dbus_service.NameHasOwner(ZeitgeistDBusInterface.BUS_NAME):
- pass
-# TODO: We should somehow set a timeout and kill the old process
-# if it doesn't quit when we ask it to. (Perhaps we should at least
-# steal the bus using replace_existing=True)
- else:
-raise RuntimeError(
- (An existing instance was found. Please use
- --replace to quit it and start a new instance.)
-)
+ self._handle_existing_instance()
elif hasattr(_config, options) and _config.options.quit:
logging.info(There is no running instance; doing nothing.)
- else:
- # service is not running, save to start
- logging.debug(No running instances found.)
if hasattr(_config, options) and _config.options.quit:
- sys.exit(0)
+ raise SystemExit(0)
- bus = dbus.service.BusName(ZeitgeistDBusInterface.BUS_NAME, sbus, do_not_queue=True)
+ bus = self._acquire_bus(recursive=True)
dbus.service.Object.__init__(self, bus, ZeitgeistDBusInterface.OBJECT_PATH)
+
+ def _acquire_bus(self, recursive):
+ try:
+ return dbus.service.BusName(ZeitgeistDBusInterface.BUS_NAME,
+self._session_bus, do_not_queue=True)
+ except dbus.NameExistsException:
+ # Look what we've got, a race condition! (LP: #732015)
+ if recursive:
+# Let's call _handle_existing_instance again; it'll either raise
+# a RuntimeError or free the bus for us.
+self._handle_existing_instance()
+if recursive:
+ # If we're still here, try to get the bus a second time.
+ return self._acquire_bus(recursive=False)
+ else:
+raise RuntimeError(Failed to acquire the bus. Please try again.)
+
+ def _handle_existing_instance(self):
+ if hasattr(_config, options) and (_config.options.replace or _config.options.quit):
+ if _config.options.quit:
+logging.info(Stopping the currently running instance...)
+ else:
+logging.debug(Replacing currently running process...)
+ interface = ZeitgeistDBusInterface()
+ interface.Quit()
+ while self._dbus_service.NameHasOwner(ZeitgeistDBusInterface.BUS_NAME):
+pass
+ # TODO: We should somehow set a timeout and kill the old process
+ # if it doesn't quit when we ask it to. (Perhaps we should at least
+ # steal the bus using replace_existing=True)
+ else:
+ raise RuntimeError(An existing instance was found. Please use \
+ --replace to quit it and start a new instance.)
___
Mailing list: https://launchpad.net/~zeitgeist
Post to : zeitgeist@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zeitgeist
More help : https://help.launchpad.net/ListHelp