1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino * socketpair.c
3*86d7f5d3SJohn Marino */
4*86d7f5d3SJohn Marino
5*86d7f5d3SJohn Marino #include "blib.h"
6*86d7f5d3SJohn Marino #include <sys/resource.h>
7*86d7f5d3SJohn Marino #include <sys/socket.h>
8*86d7f5d3SJohn Marino #include <sys/un.h>
9*86d7f5d3SJohn Marino
10*86d7f5d3SJohn Marino #define PAGE_SIZE 4096
11*86d7f5d3SJohn Marino #define PAGE_MASK (PAGE_SIZE - 1)
12*86d7f5d3SJohn Marino
13*86d7f5d3SJohn Marino int
main(int ac,char ** av)14*86d7f5d3SJohn Marino main(int ac, char **av)
15*86d7f5d3SJohn Marino {
16*86d7f5d3SJohn Marino long long count = 0;
17*86d7f5d3SJohn Marino long long max;
18*86d7f5d3SJohn Marino char c;
19*86d7f5d3SJohn Marino int j;
20*86d7f5d3SJohn Marino int loops;
21*86d7f5d3SJohn Marino int bytes;
22*86d7f5d3SJohn Marino int ppri = 999;
23*86d7f5d3SJohn Marino int fds[2];
24*86d7f5d3SJohn Marino char *buf;
25*86d7f5d3SJohn Marino char *ptr;
26*86d7f5d3SJohn Marino char *msg = "datarate";
27*86d7f5d3SJohn Marino
28*86d7f5d3SJohn Marino if (ac == 1) {
29*86d7f5d3SJohn Marino fprintf(stderr, "%s blocksize[k,m] [pipe_writer_pri] [msg]\n", av[0]);
30*86d7f5d3SJohn Marino exit(1);
31*86d7f5d3SJohn Marino }
32*86d7f5d3SJohn Marino bytes = strtol(av[1], &ptr, 0);
33*86d7f5d3SJohn Marino if (*ptr == 'k' || *ptr == 'K') {
34*86d7f5d3SJohn Marino bytes *= 1024;
35*86d7f5d3SJohn Marino } else if (*ptr == 'm' || *ptr == 'M') {
36*86d7f5d3SJohn Marino bytes *= 1024 * 1024;
37*86d7f5d3SJohn Marino } else if (*ptr) {
38*86d7f5d3SJohn Marino fprintf(stderr, "Illegal numerical suffix: %s\n", ptr);
39*86d7f5d3SJohn Marino exit(1);
40*86d7f5d3SJohn Marino }
41*86d7f5d3SJohn Marino if (bytes <= 0) {
42*86d7f5d3SJohn Marino fprintf(stderr, "I can't handle %d sized buffers\n", bytes);
43*86d7f5d3SJohn Marino exit(1);
44*86d7f5d3SJohn Marino }
45*86d7f5d3SJohn Marino if (ac >= 3)
46*86d7f5d3SJohn Marino ppri = strtol(av[2], NULL, 0);
47*86d7f5d3SJohn Marino if (ac >= 4)
48*86d7f5d3SJohn Marino msg = av[3];
49*86d7f5d3SJohn Marino
50*86d7f5d3SJohn Marino buf = mmap(NULL, bytes * 2 + PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
51*86d7f5d3SJohn Marino if (buf == MAP_FAILED) {
52*86d7f5d3SJohn Marino perror("mmap/buffer");
53*86d7f5d3SJohn Marino exit(1);
54*86d7f5d3SJohn Marino }
55*86d7f5d3SJohn Marino
56*86d7f5d3SJohn Marino bzero(buf, bytes * 2 + PAGE_SIZE);
57*86d7f5d3SJohn Marino
58*86d7f5d3SJohn Marino printf("tests one-way socketpair\n");
59*86d7f5d3SJohn Marino if (socketpair(AF_LOCAL, SOCK_STREAM, PF_UNSPEC, fds)) {
60*86d7f5d3SJohn Marino perror("socketpair");
61*86d7f5d3SJohn Marino exit(1);
62*86d7f5d3SJohn Marino }
63*86d7f5d3SJohn Marino if (fork() == 0) {
64*86d7f5d3SJohn Marino /*
65*86d7f5d3SJohn Marino * child process
66*86d7f5d3SJohn Marino */
67*86d7f5d3SJohn Marino int n;
68*86d7f5d3SJohn Marino int i;
69*86d7f5d3SJohn Marino
70*86d7f5d3SJohn Marino close(fds[0]);
71*86d7f5d3SJohn Marino buf += (bytes + PAGE_MASK) & ~PAGE_MASK;
72*86d7f5d3SJohn Marino i = 0;
73*86d7f5d3SJohn Marino for (;;) {
74*86d7f5d3SJohn Marino n = read(fds[1], buf + i, bytes - i);
75*86d7f5d3SJohn Marino if (n <= 0)
76*86d7f5d3SJohn Marino break;
77*86d7f5d3SJohn Marino if (n + i == bytes)
78*86d7f5d3SJohn Marino i = 0;
79*86d7f5d3SJohn Marino else
80*86d7f5d3SJohn Marino i += n;
81*86d7f5d3SJohn Marino }
82*86d7f5d3SJohn Marino _exit(0);
83*86d7f5d3SJohn Marino } else {
84*86d7f5d3SJohn Marino /*
85*86d7f5d3SJohn Marino * parent process.
86*86d7f5d3SJohn Marino */
87*86d7f5d3SJohn Marino if (ppri != 999) {
88*86d7f5d3SJohn Marino if (setpriority(PRIO_PROCESS, getpid(), ppri) < 0) {
89*86d7f5d3SJohn Marino perror("setpriority");
90*86d7f5d3SJohn Marino exit(1);
91*86d7f5d3SJohn Marino }
92*86d7f5d3SJohn Marino }
93*86d7f5d3SJohn Marino close(fds[1]);
94*86d7f5d3SJohn Marino
95*86d7f5d3SJohn Marino /*
96*86d7f5d3SJohn Marino * Figure out how many loops it takes for 1 second's worth.
97*86d7f5d3SJohn Marino */
98*86d7f5d3SJohn Marino start_timing();
99*86d7f5d3SJohn Marino for (j = 0; ; ++j) {
100*86d7f5d3SJohn Marino if (write(fds[0], buf, bytes) != bytes) {
101*86d7f5d3SJohn Marino perror("write");
102*86d7f5d3SJohn Marino exit(1);
103*86d7f5d3SJohn Marino }
104*86d7f5d3SJohn Marino if ((j & 31) == 0 && stop_timing(0, NULL))
105*86d7f5d3SJohn Marino break;
106*86d7f5d3SJohn Marino }
107*86d7f5d3SJohn Marino loops = j * 2 + 1;
108*86d7f5d3SJohn Marino usleep(1000000 / 10);
109*86d7f5d3SJohn Marino start_timing();
110*86d7f5d3SJohn Marino
111*86d7f5d3SJohn Marino for (j = loops; j; --j) {
112*86d7f5d3SJohn Marino if (write(fds[0], buf, bytes) != bytes) {
113*86d7f5d3SJohn Marino perror("write");
114*86d7f5d3SJohn Marino exit(1);
115*86d7f5d3SJohn Marino }
116*86d7f5d3SJohn Marino }
117*86d7f5d3SJohn Marino close(fds[0]);
118*86d7f5d3SJohn Marino while(wait(NULL) >= 0)
119*86d7f5d3SJohn Marino ;
120*86d7f5d3SJohn Marino stop_timing(loops, "full duplex socketpair / %dK bufs:", bytes / 1024);
121*86d7f5d3SJohn Marino printf("%s: blkSize %d %5.2f MBytes/sec\n",
122*86d7f5d3SJohn Marino msg,
123*86d7f5d3SJohn Marino bytes,
124*86d7f5d3SJohn Marino (double)loops * bytes * 1000000.0 /
125*86d7f5d3SJohn Marino (1024.0 * 1024.0 * get_timing()));
126*86d7f5d3SJohn Marino }
127*86d7f5d3SJohn Marino return(0);
128*86d7f5d3SJohn Marino }
129