AnyEvent-Task
view release on metacpan or search on metacpan
lib/AnyEvent/Task/Util.pm view on Meta::CPAN
package AnyEvent::Task::Util;
use common::sense;
use AnyEvent::Util;
our @children_sockets;
sub fork_anyevent_subprocess {
my ($code, %args) = @_;
my ($socka, $sockb) = AnyEvent::Util::portable_socketpair;
die "No AnyEvent watchers should be created prior to forking (AE model: $AnyEvent::MODEL)" if defined $AnyEvent::MODEL;
my $pid = fork;
die "couldn't fork: $!" if !defined $pid;
if (!$pid) {
close($socka);
AnyEvent::Util::close_all_fds_except 0, 1, 2, fileno($sockb), @{$args{dont_close_fds}};
## If parent closes its side of the socket we should exit
my $watcher = AE::io $sockb, 0, sub { exit };
$code->();
die "AnyEvent::Task::Server->run should never return";
}
close $sockb;
return ($socka, $pid) if wantarray;
push @children_sockets, $socka; # keep reference alive
return;
}
1;
( run in 0.840 second using v1.01-cache-2.11-cpan-df04353d9ac )