summaryrefslogtreecommitdiffstats
path: root/waitlib/testwait.c
diff options
context:
space:
mode:
Diffstat (limited to 'waitlib/testwait.c')
-rw-r--r--waitlib/testwait.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/waitlib/testwait.c b/waitlib/testwait.c
index fb0fe48..a720e49 100644
--- a/waitlib/testwait.c
+++ b/waitlib/testwait.c
@@ -1,5 +1,5 @@
/*
-** Copyright 1998 - 2006 Double Precision, Inc.
+** Copyright 1998 - 2020 Double Precision, Inc.
** See COPYING for distribution information.
*/
@@ -10,17 +10,20 @@
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
+#include <pthread.h>
/* Stress test waitlib.c */
#define NUMCHILDREN 100 /* Start 100 child processes */
#define INITCHILDREN 10 /* Start with these many child procs */
-static unsigned started, finished;
+static unsigned started;
+static int reap_pipefd[2];
static void reap_child(pid_t p, int dummy)
{
- ++finished;
+ if (write(reap_pipefd[1], "", 1) < 0)
+ ; /* shut up gcc */
}
static RETSIGTYPE sighandler(int sig)
@@ -58,8 +61,9 @@ int main()
int pipefd[2];
int pipefd2[2];
char c;
+unsigned finished=0;
- if (pipe(pipefd) || pipe(pipefd2))
+ if (pipe(reap_pipefd) || pipe(pipefd) || pipe(pipefd2))
{
perror("pipe");
exit(1);
@@ -67,7 +71,7 @@ char c;
signal(SIGCHLD, sighandler);
- started=finished=0;
+ started=0;
while (started < INITCHILDREN)
{
if (start_child() == 0)
@@ -87,13 +91,22 @@ char c;
; /* Shut gcc up */
close(pipefd[1]);
close(pipefd2[0]);
-
while (started < NUMCHILDREN)
if (start_child() == 0)
_exit(0);
alarm(30);
while (finished < started)
- foobar();
+ {
+ char c;
+ int n=read(reap_pipefd[0], &c, 1);
+
+ if (n <= 0)
+ {
+ fprintf(stderr, "pipe error\n");
+ exit(1);
+ }
+ ++finished;
+ }
exit(0);
}