summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-12-15 13:01:38 +0100
committerJavier Jardón <jjardon@gnome.org>2014-12-15 13:11:21 +0000
commit243b8d4d7490deaa1a87996a3ccf2057c77191b8 (patch)
tree7cfb07c6043258e13117c14343a94f9a1f4daeda
parent463b914d4f1efbf5de6d1f45e9037b88a1eb107f (diff)
downloadweston-baserock/jjardon/logind.tar.gz
logind: use SIGRTMIN to not conflict with xwaylandbaserock/jjardon/logind
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 loose signals (which wouldn't really matter, but is confusing in logs). Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
-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 6a1b4989..7fdfc4ac 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");