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