delete $self->{done_timer};
_done_for_now($self);
};
- my $cb = sub {
+ my $cb = sub { # called by PublicInbox::DirIdle::event_step
_try_path($self, $_[0]->fullname);
$self->{done_timer} //= PublicInbox::DS::requeue($done);
};
if (ref($inboxes)) {
for my $ibx (@$inboxes) {
my $eml = PublicInbox::Eml->new($$raw);
- my $x = import_eml($self, $ibx, $eml);
+ import_eml($self, $ibx, $eml);
}
} elsif ($inboxes eq 'watchspam') {
# we don't remove unseen messages
$err = imap_fetch_all($self, $mic, $url);
$err //= imap_idle_once($self, $mic, $intvl, $url);
} else {
- $err = "not connected: $!";
+ $err = "E: not connected: $!";
}
if ($err && !$self->{quit}) {
warn $err, "\n";
sub watch_atfork_parent ($) {
my ($self) = @_;
_done_for_now($self);
+ PublicInbox::Sigfd::block_signals();
}
sub imap_idle_requeue ($) { # DS::add_timer callback
return if $self->{quit};
my $idle_todo = $self->{idle_todo};
if ($idle_todo && @$idle_todo) {
- watch_atfork_parent($self);
- while (my $url_intvl = shift(@$idle_todo)) {
- imap_idle_fork($self, $url_intvl);
- }
+ my $oldset = watch_atfork_parent($self);
+ eval {
+ while (my $url_intvl = shift(@$idle_todo)) {
+ imap_idle_fork($self, $url_intvl);
+ }
+ };
+ PublicInbox::Sigfd::sig_setmask($oldset);
+ die $@ if $@;
}
goto(&fs_scan_step) if $self->{mdre};
}
sub poll_fetch_fork ($) { # DS::add_timer callback
my ($self, $intvl, $urls) = @{$_[0]};
return if $self->{quit};
- watch_atfork_parent($self);
- defined(my $pid = fork) or die "fork: $!";
- if ($pid == 0) {
+ my $oldset = watch_atfork_parent($self);
+ my $pid = fork;
+ if (defined($pid) && $pid == 0) {
watch_atfork_child($self);
if ($urls->[0] =~ m!\Aimaps?://!i) {
watch_imap_fetch_all($self, $urls);
}
_exit(0);
}
+ PublicInbox::Sigfd::sig_setmask($oldset);
+ die "fork: $!" unless defined $pid;
$self->{poll_pids}->{$pid} = [ $intvl, $urls ];
PublicInbox::DS::dwaitpid($pid, \&poll_fetch_reap, $self);
}
}
}
-sub watch {
+sub watch { # main entry point
my ($self, $sig, $oldset) = @_;
$self->{oldset} = $oldset;
$self->{sig} = $sig;
}
watch_fs_init($self) if $self->{mdre};
PublicInbox::DS->SetPostLoopCallback(sub { !$self->quit_done });
- PublicInbox::DS->EventLoop;
+ PublicInbox::DS->EventLoop; # calls ->event_step
_done_for_now($self);
}
sub _spamcheck_cb {
my ($sc) = @_;
- sub {
+ sub { # this gets called by (V2Writable||Import)->add
my ($mime, $ibx) = @_;
return if content_exists($ibx, $mime);
my $tmp = '';