1#include <stdatomic.h>
2#include <stdlib.h>
3#include <sys/mman.h>
4#include <sys/types.h>
5#include <sys/wait.h>
6#include <unistd.h>
7
8#define CHILDREN 7
9
10int main(int argc, char *argv[]) {
11 _Atomic int *sync = mmap(NULL, len: sizeof(int), PROT_READ | PROT_WRITE,
12 MAP_SHARED | MAP_ANONYMOUS, fd: -1, offset: 0);
13 if (sync == MAP_FAILED)
14 return 1;
15 *sync = 0;
16
17 for (int i = 0; i < CHILDREN; i++) {
18 pid_t pid = fork();
19 if (!pid) {
20 // child
21 while (*sync == 0)
22 ; // wait the parent in order to call execl simultaneously
23 execl(path: argv[1], arg: argv[1], NULL);
24 } else if (pid == -1) {
25 *sync = 1; // release all children
26 return 1;
27 }
28 }
29
30 // parent
31 *sync = 1; // start the program in all children simultaneously
32 for (int i = 0; i < CHILDREN; i++)
33 wait(NULL);
34
35 return 0;
36}
37

source code of compiler-rt/test/profile/Inputs/instrprof-gcov-parallel.driver.c