From 0d6777e0389fe2db3edce41d675320746433f5b7 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 31 Dec 2020 13:51:54 +0000 Subject: on_destroy: support PID owner guard Since we'll be forking for Xapian indexing and maybe other places, having a simple guard in place to ensure OnDestroy doesn't unexpectedly unlink files or similar is a safer option. --- lib/PublicInbox/LEI.pm | 5 ++--- lib/PublicInbox/Lock.pm | 4 ++-- lib/PublicInbox/OnDestroy.pm | 5 +++++ 3 files changed, 9 insertions(+), 5 deletions(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index b84e24ef..4af85d49 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -745,9 +745,8 @@ sub lazy_start { # reading the <$daemon> pipe. openlog($path, 'pid', 'user'); local $SIG{__WARN__} = sub { syslog('warning', "@_") }; - my $owner_pid = $$; - my $on_destroy = PublicInbox::OnDestroy->new(sub { - syslog('crit', "$@") if $@ && $$ == $owner_pid; + my $on_destroy = PublicInbox::OnDestroy->new($$, sub { + syslog('crit', "$@") if $@; }); open STDERR, '>&STDIN' or die "redirect stderr failed: $!"; open STDOUT, '>&STDIN' or die "redirect stdout failed: $!"; diff --git a/lib/PublicInbox/Lock.pm b/lib/PublicInbox/Lock.pm index f6eaa5ce..1d0b4f9c 100644 --- a/lib/PublicInbox/Lock.pm +++ b/lib/PublicInbox/Lock.pm @@ -36,9 +36,9 @@ sub lock_release { # caller must use return value sub lock_for_scope { - my ($self) = @_; + my ($self, @single_pid) = @_; $self->lock_acquire; - PublicInbox::OnDestroy->new(\&lock_release, $self); + PublicInbox::OnDestroy->new(@single_pid, \&lock_release, $self); } sub new_tmp { diff --git a/lib/PublicInbox/OnDestroy.pm b/lib/PublicInbox/OnDestroy.pm index 841f87d4..65ebd7dc 100644 --- a/lib/PublicInbox/OnDestroy.pm +++ b/lib/PublicInbox/OnDestroy.pm @@ -10,6 +10,11 @@ sub new { sub DESTROY { my ($cb, @args) = @{$_[0]}; + if (!ref($cb)) { + my $pid = $cb; + return if $pid != $$; + $cb = shift @args; + } $cb->(@args) if $cb; } -- cgit v1.2.3-24-ge0c7