SYSPERF - update pipe1, pipe2
[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 "blib.h"
8
9 int
10 main(int ac, char **av)
11 {
12     long long count = 0;
13     long long max;
14     char c[1];
15     int j;
16     int loops;
17     int fds[2];
18
19     printf("tests full duplex pipe 1write,2read,2write,1read loop\n");
20     if (pipe(fds)) {
21         perror("pipe");
22         exit(1);
23     }
24     if (fork() == 0) {
25         /*
26          * child process
27          */
28         close(fds[0]);
29         while (read(fds[1], c, sizeof(c)) == sizeof(c)) {
30             write(fds[1], c, sizeof(c));
31         }
32         _exit(0);
33     } else {
34         /* 
35          * parent process.
36          */
37         close(fds[1]);
38         write(fds[0], c, sizeof(c));    /* prime the caches */
39         read(fds[0], c, sizeof(c));
40
41         start_timing();
42         for (j = 0; ; ++j) {
43             write(fds[0], c, sizeof(c));
44             if (read(fds[0], c, sizeof(c)) != sizeof(c)) {
45                 fprintf(stderr, "broken pipe during test\n");
46                 exit(1);
47             }
48            if ((j & 31) == 0 && stop_timing(0, NULL))
49                 break;
50         }
51         loops = j;
52
53         start_timing();
54         for (j = 0; j < loops; ++j) {
55             write(fds[0], c, sizeof(c));
56             if (read(fds[0], c, sizeof(c)) != sizeof(c)) {
57                 fprintf(stderr, "broken pipe during test\n");
58                 exit(1);
59             }
60         }
61         stop_timing(j, "full duplex pipe / 1char:");
62         close(fds[0]);
63         while(wait(NULL) >= 0);
64     }
65     return(0);
66 }
67