summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-12-10 00:38:09 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-12-10 00:38:09 +0000
commit2e3358ee575538a669da5ef47ffab0f57457e4b1 (patch)
tree846e2ffcbd4d7af12e04521f26e97655fd5266ae /ext
parent78bfe172213c2332727a276ef10518a29117f558 (diff)
downloadperl-2e3358ee575538a669da5ef47ffab0f57457e4b1.tar.gz
Add a test case for waitpid(): from Rocco Caputo.
p4raw-id: //depot/perl@13577
Diffstat (limited to 'ext')
-rw-r--r--ext/POSIX/t/waitpid.t88
1 files changed, 88 insertions, 0 deletions
diff --git a/ext/POSIX/t/waitpid.t b/ext/POSIX/t/waitpid.t
new file mode 100644
index 0000000000..1263673bd3
--- /dev/null
+++ b/ext/POSIX/t/waitpid.t
@@ -0,0 +1,88 @@
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+BEGIN {
+ use Config;
+ unless ($Config{d_fork}) {
+ print "1..0 # no fork\n";
+ exit 0;
+ }
+ eval { use POSIX qw(sys_wait_h) };
+ if ($@) {
+ print "1..0 # no POSIX sys_wait_h\n";
+ exit 0;
+ }
+ eval { use Time::HiRes };
+ if ($@) {
+ print "1..0 # no Time::HiRes\n";
+ exit 0;
+ }
+}
+
+use warnings;
+use strict;
+
+use Time::HiRes qw(time);
+
+$| = 1;
+
+sub NEG1_PROHIBITED () { 0x01 }
+sub NEG1_REQUIRED () { 0x02 }
+
+my $count = 0;
+my $max_count = 9;
+my $state = NEG1_PROHIBITED;
+
+my $child_pid = fork();
+
+# Parent receives a nonzero child PID.
+
+if ($child_pid) {
+ my $ok = 1;
+
+ while ($count++ < $max_count) {
+ my $begin_time = time();
+ my $ret = waitpid( -1, WNOHANG );
+ my $elapsed_time = time() - $begin_time;
+
+ printf( "# waitpid(-1,WNOHANG) returned %d after %.2f seconds\n",
+ $ret, $elapsed_time );
+ if ($elapsed_time > 0.5) {
+ printf( "# %.2f seconds in non-blocking waitpid is too long!\n",
+ $elapsed_time );
+ $ok = 0;
+ last;
+ }
+
+ if ($state & NEG1_PROHIBITED) {
+ if ($ret == -1) {
+ print "# waitpid should not have returned -1 here!\n";
+ $ok = 0;
+ last;
+ }
+ elsif ($ret == $child_pid) {
+ $state = NEG1_REQUIRED;
+ }
+ }
+ elsif ($state & NEG1_REQUIRED) {
+ unless ($ret == -1) {
+ print "# waitpid should have returned -1 here\n";
+ $ok = 0;
+ }
+ last;
+ }
+
+ sleep(1);
+ }
+ print $ok ? "ok 1\n" : "not ok 1\n";
+ exit(0); # parent
+} else {
+ # Child receives a zero PID and can request parent's PID with
+ # getppid().
+ sleep(3);
+ exit(0);
+}
+
+