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:
parent
ec58d06a1d
commit
8499b5606b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335941
@ -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 },
|
||||
|
Loading…
Reference in New Issue
Block a user