disorder-ondemand.in: Don't restart crashed player immediately.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 2 Jul 2021 16:59:34 +0000 (17:59 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 2 Jul 2021 16:59:34 +0000 (17:59 +0100)
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

index 3cb3850..d9429bb 100755 (executable)
@@ -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;