From: Bart Van Assche Date: Sat, 1 Dec 2018 04:49:27 +0000 (-0800) Subject: drd: Add fork test program X-Git-Tag: VALGRIND_3_15_0~146 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=66a7a592c072c1dee1e9083a19afcc6c0c1b7e76;p=thirdparty%2Fvalgrind.git drd: Add fork test program --- diff --git a/.gitignore b/.gitignore index e88e3b3a43..a17d63132b 100644 --- a/.gitignore +++ b/.gitignore @@ -320,6 +320,7 @@ /drd/tests/dlopen_lib.so /drd/tests/dlopen_main /drd/tests/drd_bitmap_test +/drd/tests/fork /drd/tests/fp_race /drd/tests/free_is_write /drd/tests/hg01_all_ok diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index d09ca5f89a..99dfefa30c 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -370,6 +370,7 @@ check_PROGRAMS = \ concurrent_close \ dlopen_main \ dlopen_lib.so \ + fork \ fp_race \ free_is_write \ hold_lock \ diff --git a/drd/tests/fork.c b/drd/tests/fork.c new file mode 100644 index 0000000000..07aaf73f74 --- /dev/null +++ b/drd/tests/fork.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +static pthread_t tid[2]; + +static void *startproc(void *arg) +{ + pid_t pid; + char *argv[] = { "/bin/ls", "/bin/ls", NULL }; + + if ((pid = fork()) == -1) { + perror("fork error"); + } else if (pid == 0) { + dup2(2, 1); // redirect stdout to stderr + execv(argv[0], argv); // child + } + + return NULL; +} + +int main(int argc, char **argv) +{ + // No arguments means serialize the fork() calls. One argument means perform + // both fork() calls concurrently. + int serialize_fork = argc == 1; + int i = 0; + int err; + + for (i = 0; i < 2; i++) { + err = pthread_create(&tid[i], NULL, &startproc, NULL); + if (err != 0) + perror("pthread_create()"); + if (serialize_fork) + pthread_join(tid[i], NULL); + } + if (!serialize_fork) { + for (i = 0; i < 2; i++) + if (tid[i]) + pthread_join(tid[i], NULL); + } + return 0; +}