1
0
mirror of https://github.com/mpv-player/mpv synced 2025-04-01 00:07:33 +00:00

vo_drm: check if signal already used

This commit is contained in:
rr- 2015-10-30 18:55:48 +01:00 committed by wm4
parent 05e39ec513
commit 03cf69f0a8

View File

@ -35,15 +35,24 @@
#define EVT_INTERRUPT 255 #define EVT_INTERRUPT 255
#define HANDLER_ACQUIRE 0 #define HANDLER_ACQUIRE 0
#define HANDLER_RELEASE 1 #define HANDLER_RELEASE 1
#define RELEASE_SIGNAL SIGUSR1
#define ACQUIRE_SIGNAL SIGUSR2
static int vt_switcher_pipe[2]; static int vt_switcher_pipe[2];
static void vt_switcher_sighandler(int sig) static void vt_switcher_sighandler(int sig)
{ {
unsigned char event = sig == SIGUSR1 ? EVT_RELEASE : EVT_ACQUIRE; unsigned char event = sig == RELEASE_SIGNAL ? EVT_RELEASE : EVT_ACQUIRE;
write(vt_switcher_pipe[1], &event, sizeof(event)); write(vt_switcher_pipe[1], &event, sizeof(event));
} }
static bool has_signal_installed(int signo)
{
struct sigaction act = { 0 };
sigaction(signo, 0, &act);
return act.sa_handler != 0;
}
int vt_switcher_init(struct vt_switcher *s, struct mp_log *log) int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
{ {
s->log = log; s->log = log;
@ -62,12 +71,21 @@ int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
return -1; return -1;
} }
if (has_signal_installed(RELEASE_SIGNAL)) {
MP_ERR(s, "Can't handle VT release - signal already used\n");
return -1;
}
if (has_signal_installed(ACQUIRE_SIGNAL)) {
MP_ERR(s, "Can't handle VT acquire - signal already used\n");
return -1;
}
struct sigaction act; struct sigaction act;
act.sa_handler = vt_switcher_sighandler; act.sa_handler = vt_switcher_sighandler;
act.sa_flags = SA_RESTART; act.sa_flags = SA_RESTART;
sigemptyset(&act.sa_mask); sigemptyset(&act.sa_mask);
sigaction(SIGUSR1, &act, 0); sigaction(RELEASE_SIGNAL, &act, 0);
sigaction(SIGUSR2, &act, 0); sigaction(ACQUIRE_SIGNAL, &act, 0);
struct vt_mode vt_mode; struct vt_mode vt_mode;
if (ioctl(s->tty_fd, VT_GETMODE, &vt_mode) < 0) { if (ioctl(s->tty_fd, VT_GETMODE, &vt_mode) < 0) {
@ -76,8 +94,8 @@ int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
} }
vt_mode.mode = VT_PROCESS; vt_mode.mode = VT_PROCESS;
vt_mode.relsig = SIGUSR1; vt_mode.relsig = RELEASE_SIGNAL;
vt_mode.acqsig = SIGUSR2; vt_mode.acqsig = ACQUIRE_SIGNAL;
if (ioctl(s->tty_fd, VT_SETMODE, &vt_mode) < 0) { if (ioctl(s->tty_fd, VT_SETMODE, &vt_mode) < 0) {
MP_ERR(s, "VT_SETMODE failed: %s\n", mp_strerror(errno)); MP_ERR(s, "VT_SETMODE failed: %s\n", mp_strerror(errno));
return -1; return -1;