|
From: Petar J. <pe...@so...> - 2018-12-12 18:15:57
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=71be91d2ddf065b86a5cd9d4f3bfc3eca3c87a4b commit 71be91d2ddf065b86a5cd9d4f3bfc3eca3c87a4b Author: Petar Jovanovic <mip...@gm...> Date: Wed Dec 12 17:45:34 2018 +0000 make outputs of drd/tests/fork* deterministic Wait for children to finish before terminating the main process. This fixes occasional failures of the following tests: drd/tests/fork-parallel (stderr) drd/tests/fork-serial (stderr) Diff: --- drd/tests/fork.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drd/tests/fork.c b/drd/tests/fork.c index 07aaf73..0f934ca 100644 --- a/drd/tests/fork.c +++ b/drd/tests/fork.c @@ -3,8 +3,12 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <sys/wait.h> -static pthread_t tid[2]; +#define NUM_THREADS 2 + +static pthread_t tid[NUM_THREADS]; +static pid_t pids[NUM_THREADS]; static void *startproc(void *arg) { @@ -16,6 +20,8 @@ static void *startproc(void *arg) } else if (pid == 0) { dup2(2, 1); // redirect stdout to stderr execv(argv[0], argv); // child + } else { + *((pid_t*)arg) = pid; } return NULL; @@ -29,17 +35,20 @@ int main(int argc, char **argv) int i = 0; int err; - for (i = 0; i < 2; i++) { - err = pthread_create(&tid[i], NULL, &startproc, NULL); + for (i = 0; i < NUM_THREADS; i++) { + err = pthread_create(&tid[i], NULL, &startproc, &pids[i]); if (err != 0) perror("pthread_create()"); if (serialize_fork) pthread_join(tid[i], NULL); } if (!serialize_fork) { - for (i = 0; i < 2; i++) + for (i = 0; i < NUM_THREADS; i++) if (tid[i]) pthread_join(tid[i], NULL); } + for (i = 0; i < NUM_THREADS; i++) + waitpid(pids[i], &err, 0); + return 0; } |