if (link($tmp, $dot_lock)) {
unlink($tmp) or die "unlink($tmp): $!";
$self->{".lock$pid"} = $dot_lock;
+ if (substr($dot_lock, 0, 1) ne '/') {
+ opendir(my $dh, '.') or
+ die "opendir . $!";
+ $self->{dh} = $dh;
+ }
return;
}
unlink($tmp) or die "unlink($tmp): $!";
$self;
}
+sub _fchdir { chdir($_[0]) } # OnDestroy callback
+
sub DESTROY {
my ($self) = @_;
if (my $f = $self->{".lock$$"}) {
+ my $x;
+ if (my $dh = delete $self->{dh}) {
+ opendir my $c, '.' or die "opendir . $!";
+ $x = PublicInbox::OnDestroy->new(\&_fchdir, $c);
+ chdir($dh) or die "chdir (for $f): $!";
+ }
unlink($f) or die "unlink($f): $! (lock stolen?)";
+ undef $x;
}
}
use POSIX qw(_exit);
use PublicInbox::DS qw(now);
use Errno qw(EAGAIN);
+use PublicInbox::OnDestroy;
use_ok 'PublicInbox::MboxLock';
my ($tmpdir, $for_destroy) = tmpdir();
my $f = "$tmpdir/f";
$mbl = PublicInbox::MboxLock->acq($f, 1, ['none']);
ok(!-f "$f.lock", 'no dotlock with none');
undef $mbl;
+{
+ opendir my $cur, '.' or BAIL_OUT $!;
+ my $od = PublicInbox::OnDestroy->new(sub { chdir $cur });
+ chdir $tmpdir or BAIL_OUT;
+ my $abs = "$tmpdir/rel.lock";
+ my $rel = PublicInbox::MboxLock->acq('rel', 1, ['dotlock']);
+ chdir '/' or BAIL_OUT;
+ ok(-f $abs, 'lock with abs path created');
+ undef $rel;
+ ok(!-f $abs, 'lock gone despite being in the wrong dir');
+}
eval {
PublicInbox::MboxLock->acq($f, 1, ['bogus']);