1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-19 02:29:40 +00:00

Add a trivial "pipe ping" (two processes) benchmark.

Obtained from:	CheriBSD
MFC after:	2 weeks
Sponsored by:	DARPA, AFRL
This commit is contained in:
Edward Tomasz Napierala 2018-07-04 13:34:43 +00:00
parent ec58d06a1d
commit 8499b5606b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335941

View File

@ -31,6 +31,7 @@
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/procdesc.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/stat.h>
@ -250,6 +251,52 @@ test_select(uintmax_t num, uintmax_t int_arg __unused, const char *path __unused
return (i);
}
static uintmax_t
test_pipeping(uintmax_t num, uintmax_t int_arg, const char *path __unused)
{
char buf[int_arg];
uintmax_t i;
ssize_t ret;
pid_t pid;
int fd[2], procfd;
if (pipe(fd) < 0)
err(-1, "pipe");
pid = pdfork(&procfd, 0);
if (pid < 0)
err(1, "pdfork");
if (pid == 0) {
close(fd[0]);
for (;;) {
ret = read(fd[1], buf, int_arg);
if ((uintmax_t)ret != int_arg)
err(1, "read");
ret = write(fd[1], buf, int_arg);
if ((uintmax_t)ret != int_arg)
err(1, "write");
}
}
close(fd[1]);
benchmark_start();
BENCHMARK_FOREACH(i, num) {
ret = write(fd[0], buf, int_arg);
if ((uintmax_t)ret != int_arg)
err(1, "write");
ret = read(fd[0], buf, int_arg);
if ((uintmax_t)ret != int_arg)
err(1, "read");
}
benchmark_stop();
close(procfd);
return (i);
}
static uintmax_t
test_socket_stream(uintmax_t num, uintmax_t int_arg, const char *path __unused)
{
@ -694,6 +741,18 @@ static const struct test tests[] = {
{ "getppid", test_getppid, .t_flags = 0 },
{ "getresuid", test_getresuid, .t_flags = 0 },
{ "clock_gettime", test_clock_gettime, .t_flags = 0 },
{ "pipeping_1", test_pipeping, .t_flags = 0, .t_int = 1 },
{ "pipeping_10", test_pipeping, .t_flags = 0, .t_int = 10 },
{ "pipeping_100", test_pipeping, .t_flags = 0, .t_int = 100 },
{ "pipeping_1000", test_pipeping, .t_flags = 0, .t_int = 1000 },
{ "pipeping_10000", test_pipeping, .t_flags = 0, .t_int = 10000 },
#ifdef notyet
/*
* XXX: Doesn't work; kernel pipe buffer too small?
*/
{ "pipeping_100000", test_pipeping, .t_flags = 0, .t_int = 100000 },
{ "pipeping_1000000", test_pipeping, .t_flags = 0, .t_int = 1000000 },
#endif
{ "gettimeofday", test_gettimeofday, .t_flags = 0 },
{ "getpriority", test_getpriority, .t_flags = 0 },
{ "getprogname", test_getprogname, .t_flags = 0 },