s6

Mirror/fork of https://skarnet.org/software/s6/
git clone https://ccx.te2000.cz/git/s6
Log | Files | Refs | README | LICENSE

commit e2f01f98672c501b6ec4b445956b48041267138f
parent df194e5564f5b32aaf0e107b97095a1dd5bdbe35
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Wed, 17 Jun 2015 10:38:04 +0000

 - Add support for SIGUSR1 for poweroff in s6-svscan
 - Optimize respawn delay in s6-supervise

Diffstat:
Mdoc/s6-svscan.html | 3++-
Msrc/supervision/s6-supervise.c | 15+++++++++++----
Msrc/supervision/s6-svscan.c | 10+++++++++-
3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/doc/s6-svscan.html b/doc/s6-svscan.html @@ -92,7 +92,8 @@ scan (and a reap) every 5 seconds. It is <em>strongly</em> discouraged to set <li> SIGHUP&nbsp;: acts as if a <tt>s6-svscanctl -h</tt> command had been received. </li> <li> SIGQUIT&nbsp;: acts as if a <tt>s6-svscanctl -q</tt> command had been received. </li> <li> SIGABRT&nbsp;: acts as if a <tt>s6-svscanctl -b</tt> command had been received. </li> - <li> SIGINT&nbsp;: acts as if a <tt>s6-svscanctl -i</tt> command had been received. </li> + <li> SIGINT&nbsp;: acts as if a <tt>s6-svscanctl -6</tt> command had been received. </li> + <li> SIGUSR1&nbsp;: acts as if a <tt>s6-svscanctl -7</tt> command had been received. </li> </ul> <h2> The reaper </h2> diff --git a/src/supervision/s6-supervise.c b/src/supervision/s6-supervise.c @@ -44,11 +44,19 @@ typedef void action_t (void) ; typedef action_t *action_t_ref ; static tain_t deadline ; +static tain_t dontrespawnbefore = TAIN_EPOCH ; static s6_svstatus_t status = { .stamp = TAIN_ZERO, .pid = 0, .flagwant = 1, .flagwantup = 1, .flagpaused = 0, .flagfinishing = 0, .wstat = 0 } ; static state_t state = DOWN ; static int cont = 1 ; static int notifyfd = -1 ; +static inline void down_and_delay (void) +{ + state = DOWN ; + if (tain_future(&dontrespawnbefore)) deadline = dontrespawnbefore ; + else tain_copynow(&deadline) ; +} + static inline void settimeout (int secs) { tain_addsec_g(&deadline, secs) ; @@ -247,6 +255,7 @@ static void trystart (void) state = UP ; status.pid = pid ; tain_copynow(&status.stamp) ; + tain_addsec_g(&dontrespawnbefore, 1) ; announce() ; ftrigw_notifyb_nosig(S6_SUPERVISE_EVENTDIR, "u", 1) ; } @@ -291,8 +300,7 @@ static inline void tryfinish (int islast) { strerr_warnwu2sys("fork for ", "./finish") ; if (islast) bail() ; - state = DOWN ; - settimeout(1) ; + down_and_delay() ; return ; } else if (!pid) @@ -385,9 +393,8 @@ static void finish_z (void) { status.pid = 0 ; status.flagfinishing = 0 ; - state = DOWN ; + down_and_delay() ; announce() ; - settimeout(1) ; } static void finish_u (void) diff --git a/src/supervision/s6-svscan.c b/src/supervision/s6-svscan.c @@ -109,6 +109,12 @@ static void intr (void) term() ; } +static void usr1 (void) +{ + finish_arg = "poweroff" ; + term() ; +} + static void handle_signals (void) { for (;;) @@ -124,6 +130,7 @@ static void handle_signals (void) case SIGQUIT : quit() ; break ; case SIGABRT : cont = 0 ; break ; case SIGINT : intr() ; break ; + case SIGUSR1 : usr1() ; break ; } } } @@ -152,7 +159,7 @@ static void handle_control (int fd) case 'i' : intr() ; return ; case 'q' : quit() ; return ; case '0' : finish_arg = "halt" ; term() ; return ; - case '7' : finish_arg = "poweroff" ; term() ; return ; + case '7' : usr1() ; return ; case '8' : finish_arg = "other" ; term() ; return ; default : { @@ -446,6 +453,7 @@ int main (int argc, char const *const *argv) sigaddset(&set, SIGQUIT) ; sigaddset(&set, SIGABRT) ; sigaddset(&set, SIGINT) ; + sigaddset(&set, SIGUSR1) ; if (selfpipe_trapset(&set) < 0) strerr_diefu1sys(111, "trap signals") ; }