Merge from vendor branch DIFFUTILS:
[dragonfly.git] / test / sysperf / pipe2.c
1 /*
2  * pipe2.c
3  *
4  * $DragonFly: src/test/sysperf/pipe2.c,v 1.3 2004/04/01 01:47:44 dillon Exp $
5  */
6
7 #include "blib.h"
8 #include <sys/resource.h>
9
10 #define LOOPS   ((int)(1000000LL * 16384 / bytes / divisor))
11
12 int
13 main(int ac, char **av)
14 {
15     long long count = 0;
16     long long max;
17     char c;
18     int j;
19     int bytes;
20     int divisor;
21     int ppri = 999;
22     int fds[2];
23     char *buf;
24     char *ptr;
25
26     if (ac == 1) {
27         fprintf(stderr, "%s blocksize[k,m] [pipe_writer_pri]\n", av[0]);
28         exit(1);
29     }
30     bytes = strtol(av[1], &ptr, 0);
31     if (*ptr == 'k' || *ptr == 'K') {
32         bytes *= 1024;
33     } else if (*ptr == 'm' || *ptr == 'M') {
34         bytes *= 1024 * 1024;
35     } else if (*ptr) {
36         fprintf(stderr, "Illegal numerical suffix: %s\n", ptr);
37         exit(1);
38     }
39     if (bytes <= 0) {
40         fprintf(stderr, "I can't handle %d sized buffers\n", bytes);
41         exit(1);
42     }
43     if (ac >= 3)
44         ppri = strtol(av[2], NULL, 0);
45
46     /*
47      * Tiny block sizes, try to take into account overhead.
48      */
49     if (bytes < 4096)
50         divisor = 4096 / bytes;
51     else if (bytes > 1024 * 1024)
52         divisor = 2;
53     else
54         divisor = 1;
55
56     if ((buf = malloc(bytes)) == NULL) {
57         perror("malloc");
58         exit(1);
59     }
60
61     bzero(buf, bytes);
62
63     printf("tests one-way pipe using direct-write buffer\n");
64     if (pipe(fds)) {
65         perror("pipe");
66         exit(1);
67     }
68     if (fork() == 0) {
69         /*
70          * child process
71          */
72         close(fds[0]);
73         while (read(fds[1], buf, bytes) > 0)
74                 ;
75         _exit(0);
76     } else {
77         /* 
78          * parent process.
79          */
80         if (ppri != 999) {
81             if (setpriority(PRIO_PROCESS, getpid(), ppri) < 0) {
82                 perror("setpriority");
83                 exit(1);
84             }
85         }
86         close(fds[1]);
87         write(fds[0], buf, bytes);      /* prime the caches */
88         start_timing();
89         for (j = LOOPS; j; --j) {
90             if (write(fds[0], buf, bytes) != bytes) {
91                 perror("write");
92                 exit(1);
93             }
94         }
95         close(fds[0]);
96         while(wait(NULL) >= 0);
97         stop_timing(LOOPS, "full duplex pipe / %dK bufs:", bytes / 1024);
98         printf("datarate: %5.2f MBytes/sec\n",
99                 (double)LOOPS * bytes * 1000000.0 / 
100                 (1024.0 * 1024.0 * get_timing()));
101     }
102     return(0);
103 }
104