From be9bf4cc7c1b61a8abcbb3f64386ef10d8aa9f61 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 18 May 2015 22:25:59 +0200 Subject: 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. --- video/out/x11_common.c | 13 +++++-------- video/out/x11_common.h | 4 +++- 2 files changed, 8 insertions(+), 9 deletions(-) (limited to 'video/out') 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 #include +#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; -- cgit v1.2.3