about summary refs log tree commit homepage
path: root/lib/PublicInbox/MboxLock.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/MboxLock.pm')
-rw-r--r--lib/PublicInbox/MboxLock.pm14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/PublicInbox/MboxLock.pm b/lib/PublicInbox/MboxLock.pm
index bea0e325..856b1e21 100644
--- a/lib/PublicInbox/MboxLock.pm
+++ b/lib/PublicInbox/MboxLock.pm
@@ -60,6 +60,11 @@ sub acq_dotlock {
                         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): $!";
@@ -111,10 +116,19 @@ sub acq {
         $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;
         }
 }