Async-Simple-Pool
view release on metacpan or search on metacpan
lib/Async/Simple/Task/ForkTmpFile.pm view on Meta::CPAN
=cut
=head2 tmp_dir
Path, that used for store tomporary files.
This path must be writable.
It can be empty; in this case ( File::Spec->tmpdir() || $ENV{TEMP} ) will be used
By default:
During taint -T mode always writes files to current directory ( path = '' )
Windows outside taint -T mode writes files by default to C:\TEMP or C:\TMP
Unix outside taint -T mode writes files by default to /var/tmp/
=cut
has tmp_dir => (
is => 'ro',
isa => 'Str',
lazy => 1,
builder => 'make_tmp_dir',
);
sub make_tmp_dir {
my ( $self ) = @_;
my $tmp_dir = File::Spec->tmpdir() || '';
# For WIN taint mode calculated path starts with '\'. Remove it and stay at current(empty) dir
$tmp_dir = '' if $tmp_dir =~ /^\\$/;
# TEMP = C:\Users\XXXXXX~1\AppData\Local\Temp
$tmp_dir ||= $ENV{TEMP} // '';
# Untaint ENV: fallback, if File::Spec->tmpdir failed
return [ $tmp_dir =~ /^(.+)$/ ]->[0];
};
=head2 BUILD
internal. Some tricks here:)
1. Master process called $task->new with fork() inside
2. After forking done we have two processes:
lib/Async/Simple/Task/ForkTmpFile.pm view on Meta::CPAN
$parent_reader_fname = File::Spec->catfile( $self->tmp_dir, '_pr_tmp_' . $randname->() );
next if -f $parent_writer_fname || -f $parent_reader_fname;
last;
};
die 'Can`t obtain unique fname' if -f $parent_writer_fname || -f $parent_reader_fname;
my $pid = fork() // die "fork() failed: $!";
# With taint mode we use current directory as temp,
# Otherwise - default writable temp directory from File::Spec->tmpdir();
# child
unless ( $pid ) {
$self->writer( $parent_reader_fname );
$self->reader( $parent_writer_fname );
# Important!
# Just after that we trap into BUILD
# with the infinitive loop for child process (pid=0)
( run in 0.441 second using v1.01-cache-2.11-cpan-4e96b696675 )