diff --git a/SOURCES/xscreensaver-6.04-0001-watchdog_timer-don-t-relaunch-hacks-when-unblanking.patch b/SOURCES/xscreensaver-6.04-0001-watchdog_timer-don-t-relaunch-hacks-when-unblanking.patch new file mode 100644 index 0000000..cd571ce --- /dev/null +++ b/SOURCES/xscreensaver-6.04-0001-watchdog_timer-don-t-relaunch-hacks-when-unblanking.patch @@ -0,0 +1,85 @@ +From 82d71c1371dd15acd04088bd1a1b9827bb461765 Mon Sep 17 00:00:00 2001 +From: Mamoru TASAKA +Date: Wed, 31 Aug 2022 16:11:34 +0900 +Subject: [PATCH] watchdog_timer: don't relaunch hacks when unblanking + +Currently, when gfx receives SIGTERM and then executing xt_sigterm_handler, +after killing remaining hacks by kill_screenhack, sometimes watchdog_timer +seems called and hacks are relauched. These hacks remains unkilled even after +the parent gfx dies (immediately), and they becomes children of init, no +longer handled by xscreensaver side. + +As a workaround, when gfx receives SIGTERM and is going to die, mark so +in saver_info struct data, and watchdog_timer checks saver_info data and +will not going to relaunch hacks when seeing the mark. +--- + driver/subprocs.c | 4 ++++ + driver/types.h | 1 + + driver/windows.c | 10 +++++++++- + 3 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/driver/subprocs.c b/driver/subprocs.c +index 6e522d3..9cef60c 100644 +--- a/driver/subprocs.c ++++ b/driver/subprocs.c +@@ -461,6 +461,10 @@ xt_sigterm_handler (XtPointer data, XtSignalId *id) + fprintf (stderr, "%s: %s: unblanking\n", blurb(), + signal_name (sigterm_received)); + ++ /* mark this process now terminating, so that watchdog_time won't ++ relaunch hacks with race condition */ ++ si->terminating_p = True; ++ + /* Kill before unblanking, to stop drawing as soon as possible. */ + for (i = 0; i < si->nscreens; i++) + { +diff --git a/driver/types.h b/driver/types.h +index 8fa7c8e..cee25fe 100644 +--- a/driver/types.h ++++ b/driver/types.h +@@ -146,6 +146,7 @@ struct saver_info { + been received; set to N if SELECT or DEMO N + has been received. (This is kind of nasty.) + */ ++ Bool terminating_p; /* Whether the saver (gfx) is now terminating or not */ + }; + + +diff --git a/driver/windows.c b/driver/windows.c +index c92486a..b6576cc 100644 +--- a/driver/windows.c ++++ b/driver/windows.c +@@ -959,7 +959,7 @@ watchdog_timer (XtPointer closure, XtIntervalId *id) + { + saver_info *si = (saver_info *) closure; + saver_preferences *p = &si->prefs; +- Bool running_p, on_p; ++ Bool running_p, on_p, terminating_p; + + /* If the DPMS settings on the server have changed, change them back to + what ~/.xscreensaver says they should be. */ +@@ -972,6 +972,7 @@ watchdog_timer (XtPointer closure, XtIntervalId *id) + + running_p = any_screenhacks_running_p (si); + on_p = monitor_powered_on_p (si->dpy); ++ terminating_p = si->terminating_p; + if (running_p && !on_p) + { + int i; +@@ -983,6 +984,13 @@ watchdog_timer (XtPointer closure, XtIntervalId *id) + kill_screenhack (&si->screens[i]); + /* Do not clear current_hack here. */ + } ++ else if (terminating_p) ++ { ++ /* Server (gfx) is now terminating (with unblanking screen). ++ killing remaining hacks should have done beforehand. ++ Don't do anything here. ++ */ ++ } + else if (!running_p && on_p) + { + /* If the hack number is set but no hack is running, it is because the +-- +2.37.2 +