diff options
author | wm4 <wm4@nowhere> | 2015-05-18 22:25:59 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-05-18 22:25:59 +0200 |
commit | be9bf4cc7c1b61a8abcbb3f64386ef10d8aa9f61 (patch) | |
tree | ed02e0b7c1febeb42b7a0f8e6299e1882bac7143 /video/out | |
parent | 0d020c5c467e30c230b4ded00db938b1f4fcbb5e (diff) | |
download | mpv-be9bf4cc7c1b61a8abcbb3f64386ef10d8aa9f61.tar.bz2 mpv-be9bf4cc7c1b61a8abcbb3f64386ef10d8aa9f61.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.
Diffstat (limited to 'video/out')
-rw-r--r-- | video/out/x11_common.c | 13 | ||||
-rw-r--r-- | video/out/x11_common.h | 4 |
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; |