- # main loop
- my $quit = 0;
- while (1) {
- while (my $s = shift @caught) {
- if ($s eq 'USR1') {
- reopen_logs();
- kill_workers($s);
- } elsif ($s eq 'USR2') {
- upgrade();
- } elsif ($s =~ /\A(?:QUIT|TERM|INT)\z/) {
- exit if $quit++;
- kill_workers($s);
- } elsif ($s eq 'WINCH') {
- if (-t STDIN || -t STDOUT || -t STDERR) {
- warn
-"ignoring SIGWINCH since we are not daemonized\n";
- $SIG{WINCH} = 'IGNORE';
- } else {
- $worker_processes = 0;
- }
- } elsif ($s eq 'HUP') {
- $worker_processes = $set_workers;
- kill_workers($s);
- } elsif ($s eq 'TTIN') {
- if ($set_workers > $worker_processes) {
- ++$worker_processes;
- } else {
- $worker_processes = ++$set_workers;
- }
- } elsif ($s eq 'TTOU') {
- if ($set_workers > 0) {
- $worker_processes = --$set_workers;
- }
- } elsif ($s eq 'CHLD') {
- reap_children();
+ my $ignore_winch;
+ my $sig = {
+ USR1 => sub { reopen_logs(); kill_workers($_[0]); },
+ USR2 => \&upgrade,
+ QUIT => \&master_quit,
+ INT => \&master_quit,
+ TERM => \&master_quit,
+ WINCH => sub {
+ return if $ignore_winch || !@listeners;
+ if (-t STDIN || -t STDOUT || -t STDERR) {
+ $ignore_winch = 1;
+ warn <<EOF;
+ignoring SIGWINCH since we are not daemonized
+EOF
+ } else {
+ $worker_processes = 0;