а знатоки нюансов форков вообще и AnyEvent::Fork::RPC есть? всё работает, кроме одного странного момента:
в главном
$decoders{$layer}->{proc} = $proctmpl
->fork
->send_arg($decoders{$layer}->{inc})
->AnyEvent::Fork::RPC::run ("TLExtDecoder::run",
init => "TLExtDecoder::init",
serialiser => $AnyEvent::Fork::RPC::NSTORABLE_SERIALISER,
...
on_event => sub {
if ($_[0] eq "ae_log") {
my (undef,
$pid, $ctx, $level, $message) = @_;
(AnyEvent::Log::ctx "$layer\[
$pid]/$ctx")->log($level, $message);
} else {
AE::log warn => "event from layer $layer: $_[0]\n";
}
в воркере TLExtDecoder:
sub init {
...
$AnyEvent::Log::LOG->fmt_cb(sub { [ @_ ] }); # Lehmann docs is wrong, this is needed for
$AnyEvent::Log::LOG->log_cb(sub { # such log_cb as this
my ($time, $ctx, $lvl, $msg) = @{+shift};
if (defined &AnyEvent::Fork::RPC::event) {
AnyEvent::Fork::RPC::event (
ae_log =>
$$, $ctx->title, $lvl, $msg);
} else {
warn "[$$ before init] $msg\n";
}
});
...
sub run {
...
if ($@) {
AE::log error => "TL unpack died: $@";
return (0, undef);
}
и вот когда последнее происходит, в консоль вываливается
Use of uninitialized value $pid in concatenation (.) or string at ./cborlog.pl line 110.
Use of uninitialized value $pid in concatenation (.) or string at ./cborlog.pl line 110.
а в логе парента
2020-04-10 23:26:24.442361 +0300 error 82[]/TLExtDecoder: run:62: TL unpack died: unexpected stream end at TL/
Object.pm line 197.
так вот, куда вдруг делся pid из $$ если все остальные поля приходят нормально?.. О_о
(если что, FreeBSD и 5.30, на винде и 5.20 логгинг таким макаром нормально передавался)