Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/gtk_common/gobject_compat.py : 55%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of Xpra.
2# Copyright (C) 2012-2020 Antoine Martin <antoine@xpra.org>
3# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
4# later version. See the file COPYING for details.
6#legacy compatibility file
8import sys
9import signal
11from xpra.util import dump_all_frames, dump_gc_frames
12from xpra.os_util import SIGNAMES, POSIX, get_util_logger
15_glib_unix_signals = {}
16def register_os_signals(callback, commandtype="", signals=(signal.SIGINT, signal.SIGTERM)):
17 from gi.repository import GLib
18 def handle_signal(signum):
19 if commandtype is not None:
20 try:
21 sys.stderr.write("\n")
22 sys.stderr.flush()
23 cstr = ""
24 if commandtype:
25 cstr = commandtype+" "
26 get_util_logger().info("%sgot signal %s", cstr, SIGNAMES.get(signum, signum))
27 except OSError:
28 pass
29 callback(signum)
30 return True
31 def os_signal(signum, _frame):
32 GLib.idle_add(handle_signal, signum)
33 return True
34 for signum in signals:
35 if POSIX:
36 #replace the previous definition if we had one:
37 global _glib_unix_signals
38 current = _glib_unix_signals.get(signum, None)
39 if current:
40 GLib.source_remove(current)
41 source_id = GLib.unix_signal_add(GLib.PRIORITY_HIGH, signum, handle_signal, signum)
42 _glib_unix_signals[signum] = source_id
43 else:
44 signal.signal(signum, os_signal)
46def register_SIGUSR_signals(commandtype="Server"):
47 if not POSIX:
48 return
49 log = get_util_logger()
50 def sigusr1(_sig):
51 log.info("SIGUSR1")
52 dump_all_frames(log.info)
53 return True
54 def sigusr2(*_args):
55 log.info("SIGUSR2")
56 dump_gc_frames(log.info)
57 return True
58 register_os_signals(sigusr1, commandtype, (signal.SIGUSR1, ))
59 register_os_signals(sigusr2, commandtype, (signal.SIGUSR2, ))
62def install_signal_handlers(sstr, signal_handler):
63 #only register the glib signal handler
64 #once the main loop is running,
65 #before that we just trigger a KeyboardInterrupt
66 def do_install_signal_handlers():
67 register_os_signals(signal_handler, sstr)
68 register_SIGUSR_signals(sstr)
69 from gi.repository import GLib
70 GLib.idle_add(do_install_signal_handlers)