summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-12-30 14:33:20 +0100
committerBryce Harrington <bryce@osg.samsung.com>2015-01-16 18:34:10 -0800
commitcd6e4777bff468fc81994ee5533f08a76f87c1da (patch)
tree869d1baa622820f9c92ac03aa48bb8ace7c6996c
parentfaec1ebdb3a91fa7288381ee286b42334338ed90 (diff)
downloadweston-cd6e4777bff468fc81994ee5533f08a76f87c1da.tar.gz
logind: use SIGRTMIN to not conflict with xwayland
xwayland uses SIGUSR1 as startup notification. Make sure to use SIGRTMIN and SIGRTMIN+1 for VT handling. A bonus is SIGRT* signals can be queued multiple times, so we will be able to correctly track them and will no longer lose signals (which wouldn't really matter, but is confusing in logs). Signed-off-by: David Herrmann <dh.herrmann@gmail.com> Reviewed-by: Bryce Harrington <bryce@osg.samsung.com> Tested-by: nerdopolis <bluescreen_avenger@verizon.net>
-rw-r--r--src/logind-util.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/logind-util.c b/src/logind-util.c
index 554e64d9..132a9a2d 100644
--- a/src/logind-util.c
+++ b/src/logind-util.c
@@ -692,14 +692,10 @@ signal_event(int fd, uint32_t mask, void *data)
return 0;
}
- switch (sig.ssi_signo) {
- case SIGUSR1:
+ if (sig.ssi_signo == (unsigned int)SIGRTMIN)
ioctl(wl->vt, VT_RELDISP, 1);
- break;
- case SIGUSR2:
+ else if (sig.ssi_signo == (unsigned int)SIGRTMIN + 1)
ioctl(wl->vt, VT_RELDISP, VT_ACKACQ);
- break;
- }
return 0;
}
@@ -767,9 +763,21 @@ weston_logind_setup_vt(struct weston_logind *wl)
goto err_kbmode;
}
+ /*
+ * SIGRTMIN is used as global VT-release signal, SIGRTMIN + 1 is used
+ * as VT-acquire signal. Note that SIGRT* must be tested on runtime, as
+ * their exact values are not known at compile-time. POSIX requires 32
+ * of them to be available, though.
+ */
+ if (SIGRTMIN + 1 > SIGRTMAX) {
+ weston_log("logind: not enough RT signals available: %u-%u\n",
+ SIGRTMIN, SIGRTMAX);
+ return -EINVAL;
+ }
+
sigemptyset(&mask);
- sigaddset(&mask, SIGUSR1);
- sigaddset(&mask, SIGUSR2);
+ sigaddset(&mask, SIGRTMIN);
+ sigaddset(&mask, SIGRTMIN + 1);
sigprocmask(SIG_BLOCK, &mask, NULL);
wl->sfd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
@@ -790,8 +798,8 @@ weston_logind_setup_vt(struct weston_logind *wl)
}
mode.mode = VT_PROCESS;
- mode.relsig = SIGUSR1;
- mode.acqsig = SIGUSR2;
+ mode.relsig = SIGRTMIN;
+ mode.acqsig = SIGRTMIN + 1;
if (ioctl(wl->vt, VT_SETMODE, &mode) < 0) {
r = -errno;
weston_log("logind: cannot take over VT: %m\n");