}
my $inot = $self->{inot};
my $cur = $self->{pathmap}->{$dir} //= [];
+ my $lock = "$dir/".($ibx->version >= 2 ? 'inbox.lock' : 'ssoma.lock');
# transfer old subscriptions to the current inbox, cancel the old watch
- if (my $old_ibx = $cur->[0]) {
+ my $old_ibx = $cur->[0];
+ $cur->[0] = $ibx;
+ if ($old_ibx) {
$ibx->{unlock_subs} and
die "BUG: $dir->{unlock_subs} should not exist";
$ibx->{unlock_subs} = $old_ibx->{unlock_subs};
+
+ # Linux::Inotify2::Watch::name matches if watches are the
+ # same, no point in replacing a watch of the same name
+ if ($cur->[1]->name eq $lock) {
+ $self->{on_unlock}->{$lock} = $ibx;
+ return;
+ }
+ # rare, name changed (v1 inbox converted to v2)
$cur->[1]->cancel; # Linux::Inotify2::Watch::cancel
}
- $cur->[0] = $ibx;
- my $lock = "$dir/".($ibx->version >= 2 ? 'inbox.lock' : 'ssoma.lock');
if (my $w = $cur->[1] = $inot->watch($lock, $IN_MODIFY)) {
$self->{on_unlock}->{$w->name} = $ibx;
} else {
# ensure IDLE persists across HUP, w/o extra watches or FDs
$td->kill('HUP') or BAIL_OUT "failed to kill -imapd: $!";
- SKIP: {
- skip 'no inotify fdinfo (or support)', 2 if !@ino_info;
- my (@tmp, %prev);
- local $/ = "\n";
- my $end = time + 5;
- until (time > $end) {
- select undef, undef, undef, 0.01;
- open my $fh, '<', $ino_fdinfo or
- BAIL_OUT "$ino_fdinfo: $!";
- %prev = map { $_ => 1 } @ino_info;
- @tmp = grep(/^inotify wd:/, <$fh>);
- if (scalar(@tmp) == scalar(@ino_info)) {
- delete @prev{@tmp};
- last if scalar(keys(%prev)) == @ino_info;
- }
- }
- is(scalar @tmp, scalar @ino_info,
- 'old inotify watches replaced');
- is(scalar keys %prev, scalar @ino_info,
- 'no previous watches overlap');
- };
+ for my $n (1..2) { # kick the event loop so we know HUP is done
+ my $m = $imap_client->new(%mic_opt);
+ ok($m->login && $m->IsAuthenticated && $m->logout,
+ "connection $n works after HUP");
+ }
open($fh, '<', 't/data/0001.patch') or BAIL_OUT("open: $!");
run_script(['-mda', '--no-precheck'], $env, { 0 => $fh }) or