use IO::Handle ();
use Fcntl qw(SEEK_SET);
use PublicInbox::Config;
-use PublicInbox::Syscall qw(SFD_NONBLOCK EPOLLIN EPOLLET);
-use PublicInbox::Sigfd;
+use PublicInbox::Syscall qw(EPOLLIN EPOLLET);
use PublicInbox::DS qw(now dwaitpid);
use PublicInbox::Spawn qw(spawn popen_rd);
use PublicInbox::Lock;
'rediff' => [ '--stdin|LOCATION...',
'regenerate a diff with different options',
'stdin|', # /|\z/ must be first for lone dash
- qw(git-dir=s@ cwd! verbose|v+ color:s no-color),
+ qw(git-dir=s@ cwd! verbose|v+ color:s no-color drq:1 dequote-only:1),
@diff_opt, @lxs_opt, @net_opt, @c_opt ],
'add-external' => [ 'LOCATION',
my ($self, $buf, $exit_code) = @_;
$self->{failed}++;
err($self, $buf) if defined $buf;
- # calls fail_handler
- $self->{pkt_op_p}->pkt_do('!') if $self->{pkt_op_p};
+ $self->{pkt_op_p}->pkt_do('fail_handler') if $self->{pkt_op_p};
x_it($self, ($exit_code // 1) << 8);
undef;
}
sub note_sigpipe { # triggers sigpipe_handler
my ($self, $fd) = @_;
close(delete($self->{$fd})); # explicit close silences Perl warning
- $self->{pkt_op_p}->pkt_do('|') if $self->{pkt_op_p};
+ $self->{pkt_op_p}->pkt_do('sigpipe_handler') if $self->{pkt_op_p};
x_it($self, 13);
}
close $listener if $listener;
undef $listener;
$dir_idle->force_close if $dir_idle;
+ undef $dir_idle;
%PATH2CFG = ();
$MDIR2CFGPATH = {};
eval 'no warnings; undef $PublicInbox::LeiNoteEvent::to_flush';
sub pkt_ops {
my ($lei, $ops) = @_;
- $ops->{'!'} = [ \&fail_handler, $lei ];
- $ops->{'|'} = [ \&sigpipe_handler, $lei ];
- $ops->{x_it} = [ \&x_it, $lei ];
- $ops->{child_error} = [ \&child_error, $lei ];
- $ops->{incr} = [ \&incr, $lei ];
+ $ops->{fail_handler} = [ $lei ];
+ $ops->{sigpipe_handler} = [ $lei ];
+ $ops->{x_it} = [ $lei ];
+ $ops->{child_error} = [ $lei ];
+ $ops->{incr} = [ $lei ];
$ops;
}
USR1 => \&noop,
USR2 => \&noop,
};
- my $sigfd = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK);
- local @SIG{keys %$sig} = values(%$sig) unless $sigfd;
- undef $sig;
- local $SIG{PIPE} = 'IGNORE';
require PublicInbox::DirIdle;
local $dir_idle = PublicInbox::DirIdle->new([$sock_dir], sub {
# just rely on wakeup to hit PostLoopCallback set below
dir_idle_handler($_[0]) if $_[0]->fullname ne $path;
}, 1);
- if ($sigfd) {
- undef $sigfd; # unref, already in DS::DescriptorMap
- } else {
- # wake up every second to accept signals if we don't
- # have signalfd or IO::KQueue:
- PublicInbox::DS::sig_setmask($oldset);
- PublicInbox::DS->SetLoopTimeout(1000);
- }
PublicInbox::DS->SetPostLoopCallback(sub {
my ($dmap, undef) = @_;
if (@st = defined($path) ? stat($path) : ()) {
open STDERR, '>&STDIN' or die "redirect stderr failed: $!";
open STDOUT, '>&STDIN' or die "redirect stdout failed: $!";
# $daemon pipe to `lei' closed, main loop begins:
- eval { PublicInbox::DS->EventLoop };
+ eval { PublicInbox::DS::event_loop($sig, $oldset) };
warn "event loop error: $@\n" if $@;
+ # exit() may trigger waitpid via various DESTROY, ensure interruptible
+ PublicInbox::DS::sig_setmask($oldset);
dump_and_clear_log();
exit($exit_code // 0);
}
sub refresh_watches {
my ($lei) = @_;
+ $dir_idle or return;
my $cfg = _lei_cfg($lei) or return;
my $old = $cfg->{-watches};
my $watches = $cfg->{-watches} //= {};
require PublicInbox::LeiWatch;
$watches->{$url} //= PublicInbox::LeiWatch->new($url);
$seen{$url} = undef;
- my $state = $cfg->get_1("watch.$url", 'state');
+ my $state = $cfg->get_1("watch.$url.state");
if (!watch_state_ok($state)) {
$lei->err("watch.$url.state=$state not supported");
next;