Skip to content

Commit

Permalink
#1123 move dbus cleanup to server, move x11 property saving / retriev…
Browse files Browse the repository at this point in the history
…ing to server - init cannot be moved yet

git-svn-id: https://xpra.org/svn/Xpra/trunk@22660 3bb7dfac-3a0b-4e04-842a-767bc560f471
  • Loading branch information
totaam committed May 8, 2019
1 parent be87146 commit a43fff1
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 58 deletions.
67 changes: 15 additions & 52 deletions src/xpra/scripts/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ def impcheck(*modules):

def make_desktop_server(clobber):
from xpra.x11.desktop_server import XpraDesktopServer
return XpraDesktopServer()
return XpraDesktopServer(clobber)

def make_server(clobber):
from xpra.x11.server import XpraServer
Expand Down Expand Up @@ -942,36 +942,15 @@ def noerr(fn, *args):
if opts.chdir:
os.chdir(opts.chdir)

dbus_pid = 0
dbus_env = {}
kill_dbus = None
dbus_pid, dbus_env = 0, {}
if not shadowing and POSIX and not clobber:
no_gtk()
dbuslog = Logger("dbus")
assert starting or starting_desktop or proxying
bus_address = protected_env.get("DBUS_SESSION_BUS_ADDRESS")
dbuslog("dbus_launch=%s, current DBUS_SESSION_BUS_ADDRESS=%s", opts.dbus_launch, bus_address)
if opts.dbus_launch and not bus_address:
#start a dbus server:
def _kill_dbus():
dbuslog("kill_dbus: dbus_pid=%s" % dbus_pid)
if dbus_pid<=0:
return
try:
os.kill(dbus_pid, signal.SIGINT)
except Exception as e:
dbuslog("os.kill(%i, SIGINT)", dbus_pid, exc_info=True)
dbuslog.warn("Warning: error trying to stop dbus with pid %i:", dbus_pid)
dbuslog.warn(" %s", e)
kill_dbus = _kill_dbus
add_cleanup(kill_dbus)
#this also updates os.environ with the dbus attributes:
from xpra.server.dbus.dbus_start import start_dbus
dbus_pid, dbus_env = start_dbus(opts.dbus_launch)
dbuslog("dbus attributes: pid=%s, env=%s", dbus_pid, dbus_env)
if dbus_env:
os.environ.update(dbus_env)
os.environ.update(protected_env)
from xpra.server.dbus.dbus_start import start_dbus
dbus_pid, dbus_env = start_dbus(opts.dbus_launch)
if dbus_env:
os.environ.update(dbus_env)
os.environ.update(protected_env)

display = None
if not proxying:
Expand Down Expand Up @@ -1054,36 +1033,19 @@ def _kill_dbus():
if not check_xvfb():
return 1

#now we can save values on the display
#(we cannot access gtk3 until dbus has started up)
if not clobber:
from xpra.server.dbus.dbus_start import save_dbus_pid, save_dbus_env
if xvfb_pid:
save_xvfb_pid(xvfb_pid)
if dbus_pid:
save_dbus_pid(dbus_pid)
if dbus_env:
save_dbus_env(dbus_env)
else:
#get the saved pids and env
dbus_pid = get_dbus_pid()
dbus_env = get_dbus_env()
dbuslog = Logger("dbus")
dbuslog("retrieved existing dbus attributes: %s, %s", dbus_pid, dbus_env)
if dbus_env:
os.environ.update(dbus_env)
save_uinput_id(uinput_uuid)

log("env=%s", os.environ)
if starting or upgrading:
app = make_server(clobber)
else:
assert starting_desktop or upgrading_desktop
app = make_desktop_server()
app = make_desktop_server(clobber)
app.init_virtual_devices(devices)

try:
app._ssl_wrap_socket = wrap_socket_fn
app.init_dbus(dbus_pid, dbus_env)
app.original_desktop_display = desktop_display
app.exec_cwd = opts.chdir or cwd
app.init(opts)
Expand Down Expand Up @@ -1127,9 +1089,12 @@ def _kill_dbus():

try:
#from here on, we own the vfb, even if we inherited one:
if (starting or starting_desktop or upgrading or upgrading_desktop) and clobber:
#and it will be killed if exit cleanly:
xvfb_pid = get_xvfb_pid()
if (starting or starting_desktop or upgrading or upgrading_desktop):
if clobber:
#and it will be killed if exit cleanly:
xvfb_pid = get_xvfb_pid()
elif xvfb_pid:
save_xvfb_pid(xvfb_pid)

log("running %s", app.run)
r = app.run()
Expand All @@ -1145,8 +1110,6 @@ def _kill_dbus():
# Upgrading/exiting, so leave X and dbus servers running
if kill_display:
_cleanups.remove(kill_display)
if kill_dbus:
_cleanups.remove(kill_dbus)
from xpra.server import EXITING_CODE
if r==EXITING_CODE:
log.info("exiting: not cleaning up Xvfb")
Expand Down
25 changes: 24 additions & 1 deletion src/xpra/server/server_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,8 @@ def __init__(self):
self._socket_timeout = SERVER_SOCKET_TIMEOUT
self._ws_timeout = 5
self._socket_dir = None
self.dbus_pid = 0
self.dbus_env = {}
self.dbus_control = False
self.dbus_server = None
self.unix_socket_paths = []
Expand Down Expand Up @@ -396,6 +398,8 @@ def cleanup(self):
self._potential_protocols = []
self.cleanup_udp_listeners()
self.cleanup_dbus_server()
if not self._upgrading:
self.stop_dbus_server()

def do_cleanup(self):
#allow just a bit of time for the protocol packet flush
Expand All @@ -404,7 +408,26 @@ def do_cleanup(self):

######################################################################
# dbus:
def init_dbus(self, dbus_pid, dbus_env):
if not POSIX:
return
self.dbus_pid = dbus_pid
self.dbus_env = dbus_env

def stop_dbus_server(self):
dbuslog("stop_dbus_server() dbus_pid=%s", self.dbus_pid)
if self.dbus_pid<=0:
return
try:
os.kill(self.dbus_pid, signal.SIGINT)
except Exception as e:
dbuslog("os.kill(%i, SIGINT)", self.dbus_pid, exc_info=True)
dbuslog.warn("Warning: error trying to stop dbus with pid %i:", self.dbus_pid)
dbuslog.warn(" %s", e)

def init_dbus_server(self):
if not POSIX:
return
dbuslog("init_dbus_server() dbus_control=%s", self.dbus_control)
dbuslog("init_dbus_server() env: %s", dict((k,v) for k,v in os.environ.items()
if bytestostr(k).startswith("DBUS_")))
Expand All @@ -425,7 +448,7 @@ def cleanup_dbus_server(self):
ds.cleanup()
self.dbus_server = None

def make_dbus_server(self):
def make_dbus_server(self): #pylint: disable=useless-return
dbuslog("make_dbus_server() no dbus server for %s", self)
return None

Expand Down
6 changes: 4 additions & 2 deletions src/xpra/x11/desktop_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,11 @@ class XpraDesktopServer(DesktopServerBaseClass):
"xpra-motion-event" : one_arg_signal,
}

def __init__(self):
def __init__(self, clobber=False):
X11ServerBase.__init__(self, clobber)
for c in DESKTOPSERVER_BASES:
c.__init__(self)
if c!=X11ServerBase:
c.__init__(self)
self.session_type = "desktop"
self.resize_timer = None
self.resize_value = None
Expand Down
3 changes: 1 addition & 2 deletions src/xpra/x11/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,6 @@ class XpraServer(gobject.GObject, X11ServerBase):
}

def __init__(self, clobber):
self.clobber = clobber
self.root_overlay = None
self.repaint_root_overlay_timer = None
self.configure_damage_timers = {}
Expand All @@ -205,7 +204,7 @@ def __init__(self, clobber):
self.last_raised = None
self.system_tray = False
gobject.GObject.__init__(self)
X11ServerBase.__init__(self)
X11ServerBase.__init__(self, clobber)
self.session_type = "seamless"

def init(self, opts):
Expand Down
29 changes: 28 additions & 1 deletion src/xpra/x11/x11_server_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import os

from xpra.os_util import bytestostr, strtobytes, hexstr
from xpra.util import nonl, typedict, envbool, iround
from xpra.gtk_common.error import xswallow, xsync, xlog
Expand All @@ -16,6 +18,7 @@
log = Logger("x11", "server")
mouselog = Logger("x11", "server", "mouse")
screenlog = Logger("server", "screen")
dbuslog = Logger("dbus")

X11Keyboard = X11KeyboardBindings()

Expand Down Expand Up @@ -45,7 +48,8 @@ class X11ServerBase(X11ServerCore):
(see XpraServer or DesktopServer for actual implementations)
"""

def __init__(self):
def __init__(self, clobber):
self.clobber = clobber
X11ServerCore.__init__(self)
self._default_xsettings = {}
self._settings = {}
Expand All @@ -72,6 +76,29 @@ def configure_best_screen_size(self):
self.touchpad_device.root_h = root_h
return root_w, root_h


def init_dbus(self, dbus_pid, dbus_env):
from xpra.server.dbus.dbus_start import (
get_saved_dbus_pid, get_saved_dbus_env,
save_dbus_pid, save_dbus_env,
)
super(X11ServerBase, self).init_dbus(dbus_pid, dbus_env)
if self.clobber:
#get the saved pids and env
self.dbus_pid = get_saved_dbus_pid()
self.dbus_env = get_saved_dbus_env()
dbuslog("retrieved existing dbus attributes: %s, %s", self.dbus_pid, self.dbus_env)
if self.dbus_env:
os.environ.update(self.dbus_env)
else:
#now we can save values on the display
#(we cannot access gtk3 until dbus has started up)
if self.dbus_pid:
save_dbus_pid(self.dbus_pid)
if self.dbus_env:
save_dbus_env(self.dbus_env)


def last_client_exited(self):
self.reset_settings()
X11ServerCore.last_client_exited(self)
Expand Down

0 comments on commit a43fff1

Please sign in to comment.