X-Git-Url: https://git.distorted.org.uk/~mdw/disorder-toys/blobdiff_plain/8f6b6ec698be1118d56eb987a588c449d1b90c7c..c637731359e7f8412cdda193d672fceed1b3e0a2:/disorder-ondemand.in diff --git a/disorder-ondemand.in b/disorder-ondemand.in index 86b9249..a517e7b 100755 --- a/disorder-ondemand.in +++ b/disorder-ondemand.in @@ -27,19 +27,23 @@ 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' -my $STOPTIME = undef; # if $WANT eq "pause" +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,26 +53,32 @@ $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"; $STOPTIME = $NOW + $PAUSETIME; } + if ($WANT eq "on") { $WANT = "pause"; $WAKETIME = $NOW + $PAUSETIME; } } sub fix_state () { ##mumble "state = $STATE ($PID)"; - ##mumble "want = $WANT ($STOPTIME <=> $NOW)"; + ##mumble "want = $WANT ($WAKETIME <=> $NOW)"; - if ($WANT eq "pause" && $NOW >= $STOPTIME) { - $WANT = "off"; $STOPTIME = undef; + if ($WANT eq "pause" && $NOW >= $WAKETIME) { + $WANT = "off"; $WAKETIME = undef; 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; @@ -99,7 +109,7 @@ sub watch_status () { SEL: { eval { $nfd = select my $rdout = $rdin, undef, undef, - defined($STOPTIME) ? $STOPTIME - $NOW : 60; + defined($WAKETIME) ? $WAKETIME - $NOW : 60; }; if ($@ && $@->errno == EINTR) { next SEL; } elsif ($@) { mumble "error from select: " . $@->errno; last WATCH; } @@ -120,7 +130,7 @@ sub watch_status () { } @lines = split /\n/, $buffer, -1; - $buffer = pop @lines; + $buffer = pop(@lines) // ""; } for my $line (@lines) {