diff options
| author | bluhm <> | 2021-05-31 16:56:27 +0000 |
|---|---|---|
| committer | bluhm <> | 2021-05-31 16:56:27 +0000 |
| commit | d50beb99ad40e2bbff3e189486c5e902c72668bd (patch) | |
| tree | 4862f198662fc6fb628b440a537e293e967a15dc | |
| parent | 56b7ccae189caf18ce526e844a806a7c1e88e6bd (diff) | |
| download | openbsd-d50beb99ad40e2bbff3e189486c5e902c72668bd.tar.gz openbsd-d50beb99ad40e2bbff3e189486c5e902c72668bd.tar.bz2 openbsd-d50beb99ad40e2bbff3e189486c5e902c72668bd.zip | |
Since our unix receive queue got longer, the test run-t_sendrecv
did not terminate anymore on some machines. The test counts 100
send errors before it finishes. NetBSD has added sched_yield() in
the receiver loop to trigger the errors on the sender side. Although
not perfect, it works for me. Get current t_sendrecv.c from NetBSD.
Diffstat (limited to '')
| -rw-r--r-- | src/regress/lib/libc/sys/t_sendrecv.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/src/regress/lib/libc/sys/t_sendrecv.c b/src/regress/lib/libc/sys/t_sendrecv.c index cf44af2b3e..4b62505c28 100644 --- a/src/regress/lib/libc/sys/t_sendrecv.c +++ b/src/regress/lib/libc/sys/t_sendrecv.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* $OpenBSD: t_sendrecv.c,v 1.1.1.1 2019/11/19 19:57:04 bluhm Exp $ */ | 1 | /* $OpenBSD: t_sendrecv.c,v 1.2 2021/05/31 16:56:27 bluhm Exp $ */ |
| 2 | /* $NetBSD: t_sendrecv.c,v 1.6 2019/02/03 03:19:28 mrg Exp $ */ | 2 | /* $NetBSD: t_sendrecv.c,v 1.8 2021/03/28 17:30:01 christos Exp $ */ |
| 3 | 3 | ||
| 4 | /*- | 4 | /*- |
| 5 | * Copyright (c) 2018 The NetBSD Foundation, Inc. | 5 | * Copyright (c) 2018 The NetBSD Foundation, Inc. |
| @@ -33,7 +33,7 @@ | |||
| 33 | #include "macros.h" | 33 | #include "macros.h" |
| 34 | 34 | ||
| 35 | #include <sys/cdefs.h> | 35 | #include <sys/cdefs.h> |
| 36 | __RCSID("$NetBSD: t_sendrecv.c,v 1.6 2019/02/03 03:19:28 mrg Exp $"); | 36 | __RCSID("$NetBSD: t_sendrecv.c,v 1.8 2021/03/28 17:30:01 christos Exp $"); |
| 37 | 37 | ||
| 38 | #include "atf-c.h" | 38 | #include "atf-c.h" |
| 39 | #include <sys/types.h> | 39 | #include <sys/types.h> |
| @@ -44,8 +44,8 @@ __RCSID("$NetBSD: t_sendrecv.c,v 1.6 2019/02/03 03:19:28 mrg Exp $"); | |||
| 44 | #include <errno.h> | 44 | #include <errno.h> |
| 45 | #include <stdio.h> | 45 | #include <stdio.h> |
| 46 | #include <stdlib.h> | 46 | #include <stdlib.h> |
| 47 | #include <unistd.h> | ||
| 48 | #include <sched.h> | 47 | #include <sched.h> |
| 48 | #include <unistd.h> | ||
| 49 | #include <signal.h> | 49 | #include <signal.h> |
| 50 | 50 | ||
| 51 | 51 | ||
| @@ -66,61 +66,66 @@ handle_sigchld(__unused int pid) | |||
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | static void | 68 | static void |
| 69 | sender(int fd) | 69 | sender(int sd) |
| 70 | { | 70 | { |
| 71 | union packet p; | 71 | union packet p; |
| 72 | ssize_t n; | 72 | ssize_t n; |
| 73 | p.seq = 0; | 73 | p.seq = 0; |
| 74 | for (size_t i = 0; i < COUNT; i++) { | 74 | for (size_t i = 0; i < COUNT; i++) { |
| 75 | for (; (n = send(fd, &p, sizeof(p), 0)) == sizeof(p); | 75 | for (; (n = send(sd, &p, sizeof(p), 0)) == sizeof(p); |
| 76 | p.seq++) | 76 | p.seq++) |
| 77 | continue; | 77 | continue; |
| 78 | printf(">>%zd %d %ju\n", n, errno, p.seq); | 78 | // printf(">>%zd %d %ju\n", n, errno, p.seq); |
| 79 | ATF_REQUIRE_MSG(errno == ENOBUFS, "send %s", strerror(errno)); | 79 | ATF_REQUIRE_MSG(errno == ENOBUFS, "send %s", strerror(errno)); |
| 80 | // sched_yield(); | ||
| 81 | } | 80 | } |
| 82 | printf("sender done\n"); | 81 | close(sd); |
| 82 | // printf("sender done\n"); | ||
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | static void | 85 | static void |
| 86 | receiver(int fd) | 86 | receiver(int sd) |
| 87 | { | 87 | { |
| 88 | union packet p; | 88 | union packet p; |
| 89 | ssize_t n; | 89 | ssize_t n; |
| 90 | uintmax_t seq = 0; | 90 | uintmax_t seq = 0; |
| 91 | 91 | ||
| 92 | do { | 92 | for (size_t i = 0; i < COUNT; i++) { |
| 93 | if (rdied) | 93 | if (rdied) |
| 94 | return; | 94 | return; |
| 95 | while ((n = recv(fd, &p, sizeof(p), 0), sizeof(p)) | 95 | while ((n = recv(sd, &p, sizeof(p), 0), sizeof(p)) |
| 96 | == sizeof(p)) | 96 | == sizeof(p)) |
| 97 | { | 97 | { |
| 98 | if (rdied) | 98 | if (rdied) |
| 99 | return; | 99 | return; |
| 100 | if (p.seq != seq) | 100 | if (p.seq != seq) |
| 101 | printf("%ju != %ju\n", p.seq, seq); | 101 | printf("%ju != %ju\n", p.seq, seq); |
| 102 | if (seq % 10 == 0) | ||
| 103 | sched_yield(); | ||
| 102 | seq = p.seq + 1; | 104 | seq = p.seq + 1; |
| 103 | } | 105 | } |
| 104 | printf("<<%zd %d %ju\n", n, errno, seq); | 106 | // printf("<<%zd %d %ju\n", n, errno, seq); |
| 105 | if (n == 0) | 107 | if (n == 0) |
| 106 | return; | 108 | return; |
| 107 | ATF_REQUIRE_EQ(n, -1); | 109 | ATF_REQUIRE_EQ(n, -1); |
| 108 | ATF_REQUIRE_MSG(errno == ENOBUFS, "recv %s", strerror(errno)); | 110 | ATF_REQUIRE_MSG(errno == ENOBUFS, "recv %s", strerror(errno)); |
| 109 | } while (p.seq < COUNT); | 111 | } |
| 112 | close(sd); | ||
| 110 | } | 113 | } |
| 111 | 114 | ||
| 112 | static void | 115 | static void |
| 113 | sendrecv(int rerror) | 116 | sendrecv(int rerror) |
| 114 | { | 117 | { |
| 115 | int fd[2], error; | 118 | int fd[2], sd[2], error; |
| 119 | char c = 0; | ||
| 116 | struct sigaction sa; | 120 | struct sigaction sa; |
| 117 | 121 | ||
| 118 | error = socketpair(AF_UNIX, SOCK_DGRAM, 0, fd); | 122 | error = socketpair(AF_UNIX, SOCK_DGRAM, 0, sd); |
| 119 | // error = pipe(fd); | ||
| 120 | ATF_REQUIRE_MSG(error != -1, "socketpair failed (%s)", strerror(errno)); | 123 | ATF_REQUIRE_MSG(error != -1, "socketpair failed (%s)", strerror(errno)); |
| 124 | error = pipe(fd); | ||
| 125 | ATF_REQUIRE_MSG(error != -1, "pipe failed (%s)", strerror(errno)); | ||
| 121 | 126 | ||
| 122 | for (size_t i = 0; i < __arraycount(fd); i++) { | 127 | for (size_t i = 0; i < __arraycount(sd); i++) { |
| 123 | error = setsockopt(fd[i], SOL_SOCKET, SO_RERROR, &rerror, | 128 | error = setsockopt(sd[i], SOL_SOCKET, SO_RERROR, &rerror, |
| 124 | sizeof(rerror)); | 129 | sizeof(rerror)); |
| 125 | ATF_REQUIRE_MSG(error != -1, | 130 | ATF_REQUIRE_MSG(error != -1, |
| 126 | "setsockopt(SO_RERROR) failed (%s)", strerror(errno)); | 131 | "setsockopt(SO_RERROR) failed (%s)", strerror(errno)); |
| @@ -137,17 +142,18 @@ sendrecv(int rerror) | |||
| 137 | switch (fork()) { | 142 | switch (fork()) { |
| 138 | case -1: | 143 | case -1: |
| 139 | ATF_REQUIRE_MSG(errno == 0, | 144 | ATF_REQUIRE_MSG(errno == 0, |
| 140 | "socketpair failed (%s)", strerror(errno)); | 145 | "fork failed (%s)", strerror(errno)); |
| 141 | __unreachable(); | 146 | __unreachable(); |
| 142 | /*NOTREACHED*/ | 147 | /*NOTREACHED*/ |
| 143 | case 0: | 148 | case 0: |
| 144 | sched_yield(); | 149 | read(fd[1], &c, sizeof(c)); |
| 145 | sender(fd[0]); | 150 | sender(sd[0]); |
| 146 | close(fd[0]); | 151 | close(sd[0]); |
| 147 | exit(EXIT_SUCCESS); | 152 | exit(EXIT_SUCCESS); |
| 148 | /*NOTREACHED*/ | 153 | /*NOTREACHED*/ |
| 149 | default: | 154 | default: |
| 150 | receiver(fd[1]); | 155 | write(fd[0], &c, sizeof(c)); |
| 156 | receiver(sd[1]); | ||
| 151 | return; | 157 | return; |
| 152 | } | 158 | } |
| 153 | } | 159 | } |
