Merge branch 'vendor/OPENRESOLV' with the following changes:
[dragonfly.git] / test / sysperf / pipe1.c
1 /*
2  * pipe1.c
3  *
4  * $DragonFly: src/test/sysperf/pipe1.c,v 1.1 2003/08/12 02:29:44 dillon Exp $
5  */
6
7 #include <sys/types.h>
8 #include <sys/wait.h>
9 #include "blib.h"
10
11 int
12 main(int ac, char **av)
13 {
14     long long count = 0;
15     long long max;
16     char c[1];
17     int j;
18     int loops;
19     int fds[2];
20
21     printf("tests full duplex pipe 1write,2read,2write,1read loop\n");
22     if (pipe(fds)) {
23         perror("pipe");
24         exit(1);
25     }
26     if (fork() == 0) {
27         /*
28          * child process
29          */
30         close(fds[0]);
31         while (read(fds[1], c, sizeof(c)) == sizeof(c)) {
32             write(fds[1], c, sizeof(c));
33         }
34         _exit(0);
35     } else {
36         /* 
37          * parent process.
38          */
39         close(fds[1]);
40         write(fds[0], c, sizeof(c));    /* prime the caches */
41         read(fds[0], c, sizeof(c));
42
43         start_timing();
44         for (j = 0; ; ++j) {
45             write(fds[0], c, sizeof(c));
46             if (read(fds[0], c, sizeof(c)) != sizeof(c)) {
47                 fprintf(stderr, "broken pipe during test\n");
48                 exit(1);
49             }
50            if ((j & 31) == 0 && stop_timing(0, NULL))
51                 break;
52         }
53         loops = j;
54
55         start_timing();
56         for (j = 0; j < loops; ++j) {
57             write(fds[0], c, sizeof(c));
58             if (read(fds[0], c, sizeof(c)) != sizeof(c)) {
59                 fprintf(stderr, "broken pipe during test\n");
60                 exit(1);
61             }
62         }
63         stop_timing(j, "full duplex pipe / 1char:");
64         close(fds[0]);
65         while(wait(NULL) >= 0);
66     }
67     return(0);
68 }
69