use Carp qw(confess croak);
use PublicInbox::Sigfd;
my ($enc, $dec);
-# ->imports at BEGIN turns serial_*_with_object into custom ops on 5.14+
+# ->imports at BEGIN turns sereal_*_with_object into custom ops on 5.14+
# and eliminate method call overhead
BEGIN {
eval {
}
}
+# starts a worker if Sereal or Storable is installed
sub ipc_worker_spawn {
my ($self, $ident, $oldset) = @_;
- return unless $enc;
+ return unless $enc; # no Sereal or Storable
my $pid = $self->{-ipc_worker_pid};
confess "BUG: already spawned PID:$pid" if $pid;
confess "BUG: already have worker socket" if $self->{-ipc_sock};
warn "PID:$pid died with \$?=$?\n" if $?;
}
-# for base class, override in superclasses
+# for base class, override in sub classes
sub ipc_atfork_parent {}
sub ipc_atfork_child {}
+# should only be called inside the worker process
sub ipc_worker_exit {
my (undef, $code) = @_;
exit($code);
}
+# idempotent, can be called regardless of whether worker is active or not
sub ipc_worker_stop {
my ($self) = @_;
my $pid;
$self->{-ipc_lock} //= bless { lock_path => $f }, 'PublicInbox::Lock'
}
+# call $self->$sub(@args), on a worker if ipc_worker_spawn was used
sub ipc_do {
my ($self, $sub, @args) = @_;
if (my $s1 = $self->{-ipc_sock}) {