summaryrefslogtreecommitdiffstats
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
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)
-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;