diff options
Diffstat (limited to 'waitlib/testwait.c')
| -rw-r--r-- | waitlib/testwait.c | 27 | 
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);  } | 
