On 02/15/2013 10:44 AM, Jamie Strandboge wrote: > Fix two race conditions: > 1) make sure that the xpra socket exists before trying to attach to it > 2) make sure that the client has attached before we start the application > > The fix for '1' solves a problem when the system is under load and the > one for '2' fixes a problem with firefox starting too soon and not > having system themes applied. > The submitted patch had a typo. Here is a second version with that fixed and a couple of debugging cleanups for consistency in other parts of the code.
-- Jamie Strandboge http://www.ubuntu.com/
Description: Fix two race conditions: 1) make sure that the xpra socket exists before trying to attach to it 2) make sure that the client has attached before we start the application Acked-By: Jamie Strandboge <[email protected]> === modified file 'utils/apparmor/sandbox.py' --- utils/apparmor/sandbox.py 2013-01-14 14:55:53 +0000 +++ utils/apparmor/sandbox.py 2013-02-15 17:04:31 +0000 @@ -1,6 +1,6 @@ # ------------------------------------------------------------------ # -# Copyright (C) 2011-2012 Canonical Ltd. +# Copyright (C) 2011-2013 Canonical Ltd. # # This program is free software; you can redistribute it and/or # modify it under the terms of version 2 of the GNU General Public @@ -15,6 +15,7 @@ import pwd import re import signal +import socket import sys import tempfile import time @@ -605,13 +606,36 @@ self.pids.append(listener_x) started = False - time.sleep(0.5) # FIXME: detect if running - for i in range(self.timeout): # 5 seconds to start + + # We need to wait for the xpra socket to exist before attaching + fn = os.path.join(os.environ['HOME'], '.xpra', '%s-%s' % \ + (socket.gethostname(), self.display.split(':')[1])) + for i in range(self.timeout * 2): # up to self.timeout seconds to start + if os.path.exists(fn): + debug("Found '%s'! Proceeding to attach" % fn) + break + debug("'%s' doesn't exist yet, waiting" % fn) + time.sleep(0.5) + + if not os.path.exists(fn): + sys.stdout.flush() + self.cleanup() + raise AppArmorException("Could not start xpra (try again with -d)") + + for i in range(self.timeout): # Up to self.timeout seconds to start rc, out = cmd(['xpra', 'list']) - if 'LIVE session at %s' % self.display in out: + + if 'DEAD session at %s' % self.display in out: + error("xpra session at '%s' died" % self.display, do_exit=False) + break + + search = 'LIVE session at %s' % self.display + if search in out: started = True break time.sleep(1) + debug("Could not find '%s' in:\n" % search) + debug(out) if not started: sys.stdout.flush() @@ -638,6 +662,17 @@ self.pids.append(listener_attach) + # Make sure that a client has attached + for i in range(self.timeout): # up to self.timeout seconds to attach + time.sleep(1) + rc, out = cmd (['xpra', 'info', self.display]) + search = 'clients=1' + if search in out: + debug("Client successfully attached!") + break + debug("Could not find '%s' in:\n" % search) + debug(out) + msg("TODO: filter '~/.xpra/run-xpra'")
signature.asc
Description: OpenPGP digital signature
-- AppArmor mailing list [email protected] Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
