AnyEvent-Fork-Remote
view release on metacpan or search on metacpan
$done->($a);
})
}
sub new_exec {
push @_, 0;
&_new_exec
}
sub new_execp {
push @_, 1;
&_new_exec
}
=item $new_proc = $proc->fork
Quite the same as the same method of L<AnyEvent::Fork>, except that it
simply clones the object without creating an actual process.
=cut
sub fork {
my $self = shift;
bless [
$self->[0],
$self->[1],
[@{ $self->[2] }],
], ref $self
}
=item undef = $proc->pid
The C<pid> method always returns C<undef> and only exists for
compatibility with L<AnyEvent::Fork>.
=cut
sub pid {
undef
}
=item $proc = $proc->send_fh (...)
Not supported and always croaks.
=cut
sub send_fh {
Carp::croak "send_fh is not supported on AnyEvent::Fork::Remote objects";
}
=item $proc = $proc->eval ($perlcode, @args)
Quite the same as the same method of L<AnyEvent::Fork>.
=cut
# quote a binary string as a perl scalar
sub sq($) {
my $s = shift;
$s =~ /'/
or return "'$s'";
$s =~ s/(\x10+)/\x10.'$1'.q\x10/g;
"q\x10$s\x10"
}
# quote a list of strings
sub aq(@) {
"(" . (join ",", map sq $_, @_) . ")"
}
sub eval {
my ($self, $perlcode, @args) = @_;
my $linecode = $perlcode;
$linecode =~ s/\s+/ /g; # takes care of \n
$linecode =~ s/"/''/g;
substr $linecode, 70, length $linecode, "..." if length $linecode > 70;
$self->[1] .= '{ local @_ = ' . (aq @args) . ";\n#line 1 \"'$linecode'\"\n$perlcode;\n}\n";
$self
}
=item $proc = $proc->require ($module, ...)
Quite the same as the same method of L<AnyEvent::Fork>.
=cut
sub require {
my ($self, @modules) = @_;
$self->eval ("require $_")
for @modules;
$self
}
=item $proc = $proc->send_arg ($string, ...)
Quite the same as the same method of L<AnyEvent::Fork>.
=cut
sub send_arg {
my ($self, @arg) = @_;
push @{ $self->[2] }, @arg;
$self
}
=item $proc->run ($func, $cb->($fh))
Very similar to the run method of L<AnyEvent::Fork>.
On the parent side, the API is identical, except that a C<$cb> argument of
C<undef> instead of a valid file handle signals an error.
On the child side, the "communications socket" is in fact just C<*STDIN>,
and typically can only be read from (this highly depends on how the
program is created - if you just run F<perl> locally, it will work for
both reading and writing, but commands such as F<rsh> or F<ssh> typically
only provide read-only handles for STDIN).
To be portable, if the run function wants to read data that is written to
C<$fh> in the parent, then it should read from STDIN. If the run function
( run in 1.222 second using v1.01-cache-2.11-cpan-5b529ec07f3 )