From 8537d8f89b9f35271347580db8ae4ef3fd855d38 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Fri, 2 Jul 2021 17:59:34 +0100 Subject: [PATCH] disorder-ondemand.in: Don't restart crashed player immediately. Wait at least 10 s after we tried to start it. This prevents spinning if the player is just hopelessly crashy (or misconfigured). --- disorder-ondemand.in | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/disorder-ondemand.in b/disorder-ondemand.in index 3cb3850..d9429bb 100755 --- a/disorder-ondemand.in +++ b/disorder-ondemand.in @@ -27,6 +27,8 @@ sub connection () { } my $PAUSETIME = 300; +my $CRASHTIME = 10; +my $RESTARTTIME = 0; my $PID = undef; my $STATE = "off"; # `off', `on', `killed' my $WANT = "off"; # `off', `on', `pause' @@ -34,12 +36,14 @@ my $WAKETIME = undef; my $NOW = time; $SIG{CHLD} = sub { + $NOW = time; KID: for (;;) { my $kid = waitpid -1, WNOHANG; last if $kid <= 0; if ($kid == $PID) { mumble "player exited (st = $?)"; $PID = undef; $STATE = "off"; + if ($WANT eq "on" && $RESTARTTIME > $NOW) { $WAKETIME = $RESTARTTIME; } } } }; @@ -49,7 +53,12 @@ $SIG{TERM} = $SIG{INT} = sub { exit 0; }; -sub start () { $WANT = "on"; $STOPTIME = undef; } +sub start () { + if ($WANT ne "on") { + $WANT = "on"; + $WAKETIME = $NOW < $RESTARTTIME ? $RESTARTTIME : undef; + } +} sub pause () { if ($WANT eq "on") { $WANT = "pause"; $WAKETIME = $NOW + $PAUSETIME; } @@ -65,10 +74,11 @@ sub fix_state () { mumble "pause time up: stopping" if $STATE eq "on"; } - if ($WANT eq "on" && $STATE eq "off") { + if ($WANT eq "on" && $STATE eq "off" && + (!defined($WAKETIME) || $NOW >= $WAKETIME)) { my $kid = fork(); if (!$kid) { exec @ARGV; } - $STATE = "on"; $PID = $kid; + $STATE = "on"; $PID = $kid; $RESTARTTIME = $NOW + $CRASHTIME; mumble "player wanted but not running: started pid $kid"; } elsif ($WANT eq "off" && $STATE eq "on") { kill "TERM", $PID; -- 2.11.0