# 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: $!";
# 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 {
sub DESTROY {
my ($cb, @args) = @{$_[0]};
+ if (!ref($cb)) {
+ my $pid = $cb;
+ return if $pid != $$;
+ $cb = shift @args;
+ }
$cb->(@args) if $cb;
}
exit(255);
};
require PublicInbox::OnDestroy;
-my $auto_unlink = PublicInbox::OnDestroy->new(sub { unlink $lockfile });
+my $auto_unlink = PublicInbox::OnDestroy->new($$, sub { unlink $lockfile });
my ($perm, %seen);
if (-e $pi_config) {
open(my $oh, '<', $pi_config) or die "unable to read $pi_config: $!\n";
undef $od;
is_deeply(\@x, [ 'x', 'y' ], '2 args passed');
+open my $tmp, '+>>', undef or BAIL_OUT $!;
+$tmp->autoflush(1);
+$od = PublicInbox::OnDestroy->new(1, sub { print $tmp "$$ DESTROY\n" });
+undef $od;
+is(-s $tmp, 0, '$tmp is empty on pid mismatch');
+$od = PublicInbox::OnDestroy->new($$, sub { $tmp = $$ });
+undef $od;
+is($tmp, $$, '$tmp set to $$ by callback');
+
if (my $nr = $ENV{TEST_LEAK_NR}) {
for (0..$nr) {
$od = PublicInbox::OnDestroy->new(sub { @x = @_ }, qw(x y));