|
Packit |
a89ea5 |
#!/usr/bin/perl
|
|
Packit |
a89ea5 |
$| = 1;
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Note that because fork loses test count we do not use Test::More
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
use strict;
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
BEGIN {
|
|
Packit |
a89ea5 |
require Config;
|
|
Packit |
a89ea5 |
my $can_fork = $Config::Config{d_fork} ||
|
|
Packit |
a89ea5 |
(($^O eq 'MSWin32' || $^O eq 'NetWare') and
|
|
Packit |
a89ea5 |
$Config::Config{useithreads} and
|
|
Packit |
a89ea5 |
$Config::Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/
|
|
Packit |
a89ea5 |
);
|
|
Packit |
a89ea5 |
if ( $can_fork ) {
|
|
Packit |
a89ea5 |
print "1..8\n";
|
|
Packit |
a89ea5 |
} else {
|
|
Packit |
a89ea5 |
print "1..0 # Skip No fork available\n";
|
|
Packit |
a89ea5 |
exit;
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
use File::Temp;
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# OO interface
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
my $file = File::Temp->new();
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
myok( 1, -f $file->filename, "OO File exists" );
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
my $children = 2;
|
|
Packit |
a89ea5 |
for my $i (1 .. $children) {
|
|
Packit |
a89ea5 |
my $pid = fork;
|
|
Packit |
a89ea5 |
die "Can't fork: $!" unless defined $pid;
|
|
Packit |
a89ea5 |
if ($pid) {
|
|
Packit |
a89ea5 |
# parent process
|
|
Packit |
a89ea5 |
next;
|
|
Packit |
a89ea5 |
} else {
|
|
Packit |
a89ea5 |
# in a child we can't keep the count properly so we do it manually
|
|
Packit |
a89ea5 |
# make sure that child 1 dies first
|
|
Packit |
a89ea5 |
srand();
|
|
Packit |
a89ea5 |
my $time = (($i-1) * 5) +int(rand(5));
|
|
Packit |
a89ea5 |
print "# child $i sleeping for $time seconds\n";
|
|
Packit |
a89ea5 |
sleep($time);
|
|
Packit |
a89ea5 |
my $count = $i + 1;
|
|
Packit |
a89ea5 |
myok( $count, -f $file->filename(), "OO file present in child $i" );
|
|
Packit |
a89ea5 |
print "# child $i exiting\n";
|
|
Packit |
a89ea5 |
exit;
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
while ($children) {
|
|
Packit |
a89ea5 |
wait;
|
|
Packit |
a89ea5 |
$children--;
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
myok( 4, -f $file->filename(), "OO File exists in parent" );
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# non-OO interface
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
my ($fh, $filename) = File::Temp::tempfile( UNLINK => 1 );
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
myok( 5, -f $filename, "non-OO File exists" );
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
$children = 2;
|
|
Packit |
a89ea5 |
for my $i (1 .. $children) {
|
|
Packit |
a89ea5 |
my $pid = fork;
|
|
Packit |
a89ea5 |
die "Can't fork: $!" unless defined $pid;
|
|
Packit |
a89ea5 |
if ($pid) {
|
|
Packit |
a89ea5 |
# parent process
|
|
Packit |
a89ea5 |
next;
|
|
Packit |
a89ea5 |
} else {
|
|
Packit |
a89ea5 |
srand();
|
|
Packit |
a89ea5 |
my $time = (($i-1) * 5) +int(rand(5));
|
|
Packit |
a89ea5 |
print "# child $i sleeping for $time seconds\n";
|
|
Packit |
a89ea5 |
sleep($time);
|
|
Packit |
a89ea5 |
my $count = 5 + $i;
|
|
Packit |
a89ea5 |
myok( $count, -f $filename, "non-OO File present in child $i" );
|
|
Packit |
a89ea5 |
print "# child $i exiting\n";
|
|
Packit |
a89ea5 |
exit;
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
while ($children) {
|
|
Packit |
a89ea5 |
wait;
|
|
Packit |
a89ea5 |
$children--;
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
myok(8, -f $filename, "non-OO File exists in parent" );
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
# Local ok sub handles explicit number
|
|
Packit |
a89ea5 |
sub myok {
|
|
Packit |
a89ea5 |
my ($count, $test, $msg) = @_;
|
|
Packit |
a89ea5 |
|
|
Packit |
a89ea5 |
if ($test) {
|
|
Packit |
a89ea5 |
print "ok $count - $msg\n";
|
|
Packit |
a89ea5 |
} else {
|
|
Packit |
a89ea5 |
print "not ok $count - $msg\n";
|
|
Packit |
a89ea5 |
}
|
|
Packit |
a89ea5 |
return $test;
|
|
Packit |
a89ea5 |
}
|