summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc/sys
diff options
context:
space:
mode:
authorbluhm <>2021-05-31 16:56:27 +0000
committerbluhm <>2021-05-31 16:56:27 +0000
commit9a9555d3e0433a6417073e7a06c9bf130984729b (patch)
tree4862f198662fc6fb628b440a537e293e967a15dc /src/regress/lib/libc/sys
parent55b46c2aef9226b9aabc5b4026b3c5d0a0e887b5 (diff)
downloadopenbsd-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.c54
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
68static void 68static void
69sender(int fd) 69sender(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
85static void 85static void
86receiver(int fd) 86receiver(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
112static void 115static void
113sendrecv(int rerror) 116sendrecv(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}