diff options
author | bluhm <> | 2021-05-31 16:56:27 +0000 |
---|---|---|
committer | bluhm <> | 2021-05-31 16:56:27 +0000 |
commit | 9a9555d3e0433a6417073e7a06c9bf130984729b (patch) | |
tree | 4862f198662fc6fb628b440a537e293e967a15dc /src/regress/lib/libc/sys | |
parent | 55b46c2aef9226b9aabc5b4026b3c5d0a0e887b5 (diff) | |
download | openbsd-9a9555d3e0433a6417073e7a06c9bf130984729b.tar.gz openbsd-9a9555d3e0433a6417073e7a06c9bf130984729b.tar.bz2 openbsd-9a9555d3e0433a6417073e7a06c9bf130984729b.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 'src/regress/lib/libc/sys')
-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 | } |