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