]> git.proxmox.com Git - rustc.git/blob - src/compiler-rt/test/profile/Inputs/instrprof-file_ex.c
New upstream version 1.19.0+dfsg3
[rustc.git] / src / compiler-rt / test / profile / Inputs / instrprof-file_ex.c
1 /* This is a test case where the parent process forks 10
2 * children which contend to write to the same file. With
3 * file locking support, the data from each child should not
4 * be lost.
5 */
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <sys/wait.h>
10
11 extern FILE *lprofOpenFileEx(const char *);
12 int main(int argc, char *argv[]) {
13 pid_t tid;
14 FILE *F;
15 const char *FN;
16 int child[10];
17 int c;
18 int i;
19
20 if (argc < 2) {
21 fprintf(stderr, "Requires one argument \n");
22 exit(1);
23 }
24 FN = argv[1];
25 truncate(FN, 0);
26
27 for (i = 0; i < 10; i++) {
28 c = fork();
29 // in child:
30 if (c == 0) {
31 FILE *F = lprofOpenFileEx(FN);
32 if (!F) {
33 fprintf(stderr, "Can not open file %s from child\n", FN);
34 exit(1);
35 }
36 fseek(F, 0, SEEK_END);
37 fprintf(F, "Dump from Child %d\n", i);
38 fclose(F);
39 exit(0);
40 } else {
41 child[i] = c;
42 }
43 }
44
45 // In parent
46 for (i = 0; i < 10; i++) {
47 int child_status;
48 if ((tid = waitpid(child[i], &child_status, 0)) == -1)
49 break;
50 }
51 F = lprofOpenFileEx(FN);
52 if (!F) {
53 fprintf(stderr, "Can not open file %s from parent\n", FN);
54 exit(1);
55 }
56 fseek(F, 0, SEEK_END);
57 fprintf(F, "Dump from parent %d\n", i);
58 return 0;
59 }