summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-05-18 22:25:59 +0200
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>2015-05-19 11:12:47 +0900
commita7794d6fc18832b8a0bdcc603f1c92892055f202 (patch)
tree834102d4cc7fb4ce1d6710760f7680fa2885eaa9 /video
parent4d6470fde0a40ae70a4892a1e44ba3170395e54c (diff)
downloadmpv-a7794d6fc18832b8a0bdcc603f1c92892055f202.tar.bz2
mpv-a7794d6fc18832b8a0bdcc603f1c92892055f202.tar.xz
x11: never forcefully terminate xdg-screensaver process
It sometimes happens on exit, and it's probably a bad idea. If the process hangs on exit (possibly due to stupid hardcoded timeouts it's doing), mpv will also hang now, unfortunately. (cherry picked from commit be9bf4cc7c1b61a8abcbb3f64386ef10d8aa9f61)
Diffstat (limited to 'video')
-rw-r--r--video/out/x11_common.c13
-rw-r--r--video/out/x11_common.h4
2 files changed, 8 insertions, 9 deletions
diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 4fa891fc85..9a1165a207 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -483,13 +483,11 @@ static void *screensaver_thread(void *arg)
// don't queue multiple wakeups
while (!sem_trywait(&x11->screensaver_sem)) {}
- if (mp_cancel_test(x11->screensaver_terminate))
+ if (atomic_load(&x11->screensaver_terminate))
break;
char *args[] = {"xdg-screensaver", "reset", NULL};
- if (mp_subprocess(args, x11->screensaver_terminate, NULL, NULL,
- NULL, &(char*){0}))
- {
+ if (mp_subprocess(args, NULL, NULL, NULL, NULL, &(char*){0})) {
MP_WARN(x11, "Disabling screensaver failed.\n");
break;
}
@@ -515,13 +513,12 @@ int vo_x11_init(struct vo *vo)
};
vo->x11 = x11;
- x11->screensaver_terminate = mp_cancel_new(x11);
sem_init(&x11->screensaver_sem, 0, 0);
if (pthread_create(&x11->screensaver_thread, NULL, screensaver_thread, x11)) {
- x11->screensaver_terminate = NULL;
sem_destroy(&x11->screensaver_sem);
goto error;
}
+ x11->screensaver_thread_running = true;
x11_error_output = x11->log;
XSetErrorHandler(x11_errorhandler);
@@ -731,8 +728,8 @@ void vo_x11_uninit(struct vo *vo)
XCloseDisplay(x11->display);
}
- if (x11->screensaver_terminate) {
- mp_cancel_trigger(x11->screensaver_terminate);
+ if (x11->screensaver_thread_running) {
+ atomic_store(&x11->screensaver_terminate, true);
sem_post(&x11->screensaver_sem);
pthread_join(x11->screensaver_thread, NULL);
sem_destroy(&x11->screensaver_sem);
diff --git a/video/out/x11_common.h b/video/out/x11_common.h
index eeff773bef..c8ed22b248 100644
--- a/video/out/x11_common.h
+++ b/video/out/x11_common.h
@@ -24,6 +24,7 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
+#include "osdep/atomics.h"
#include "osdep/semaphore.h"
#include "common/common.h"
@@ -61,8 +62,9 @@ struct vo_x11_state {
bool dpms_touched;
double screensaver_time_last;
pthread_t screensaver_thread;
+ bool screensaver_thread_running;
sem_t screensaver_sem;
- struct mp_cancel *screensaver_terminate;
+ atomic_bool screensaver_terminate;
XIM xim;
XIC xic;