diff options
author | dim <dim@FreeBSD.org> | 2010-12-09 22:01:15 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2010-12-09 22:01:15 +0000 |
commit | a3786f65f1e2fa3a4e925fdb4b2b5544b9021bf9 (patch) | |
tree | 5f0a24f71baa3176c75a20a51a9e20a22c75426c /tools/regression/sockets/unix_gc/unix_gc.c | |
parent | ad01c620333d05c430d583ee40647e396be1ab91 (diff) | |
parent | 12dd9eb8e940c48f9fc30dbc137071b4fe5caead (diff) | |
download | FreeBSD-src-a3786f65f1e2fa3a4e925fdb4b2b5544b9021bf9.zip FreeBSD-src-a3786f65f1e2fa3a4e925fdb4b2b5544b9021bf9.tar.gz |
Sync: merge r216133 through r216338 from ^/head.
Diffstat (limited to 'tools/regression/sockets/unix_gc/unix_gc.c')
-rw-r--r-- | tools/regression/sockets/unix_gc/unix_gc.c | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/tools/regression/sockets/unix_gc/unix_gc.c b/tools/regression/sockets/unix_gc/unix_gc.c index a60aa85..8cae2d9 100644 --- a/tools/regression/sockets/unix_gc/unix_gc.c +++ b/tools/regression/sockets/unix_gc/unix_gc.c @@ -55,27 +55,36 @@ static char dpath[PATH_MAX]; static const char *test; static int -getopenfiles(void) +getsysctl(const char *name) { size_t len; int i; len = sizeof(i); - if (sysctlbyname("kern.openfiles", &i, &len, NULL, 0) < 0) - err(-1, "kern.openfiles"); + if (sysctlbyname(name, &i, &len, NULL, 0) < 0) + err(-1, "%s", name); return (i); } static int +getopenfiles(void) +{ + + return (getsysctl("kern.openfiles")); +} + +static int getinflight(void) { - size_t len; - int i; - len = sizeof(i); - if (sysctlbyname("net.local.inflight", &i, &len, NULL, 0) < 0) - err(-1, "net.local.inflight"); - return (i); + return (getsysctl("net.local.inflight")); +} + +static int +getdeferred(void) +{ + + return (getsysctl("net.local.deferred")); } static void @@ -707,6 +716,40 @@ listen_connect_drop(void) test_sysctls(inflight, openfiles); } +static void +recursion(void) +{ + int fd[2], ff[2]; + int inflight, openfiles, deferred, deferred1; + + test = "recursion"; + printf("%s\n", test); + save_sysctls(&inflight, &openfiles); + deferred = getdeferred(); + + my_socketpair(fd); + + for (;;) { + if (socketpair(PF_UNIX, SOCK_STREAM, 0, ff) == -1) { + if (errno == EMFILE || errno == ENFILE) + break; + err(-1, "socketpair"); + } + sendfd(ff[0], fd[0]); + sendfd(ff[0], fd[1]); + close2(fd[1], fd[0]); + fd[0] = ff[0]; + fd[1] = ff[1]; + } + close2(fd[0], fd[1]); + sleep(1); + test_sysctls(inflight, openfiles); + deferred1 = getdeferred(); + if (deferred != deferred1) + errx(-1, "recursion: deferred before %d after %d", deferred, + deferred1); +} + #define RMDIR "rm -Rf " int main(int argc, char *argv[]) @@ -757,6 +800,8 @@ main(int argc, char *argv[]) listen_connect_nothing(); listen_connect_drop(); + recursion(); + printf("Finish: inflight %d open %d\n", getinflight(), getopenfiles()); return (0); |