xref: /dflybsd-src/test/sysperf/socketpair.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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