[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 05/11] test-util-sockets: Synchronize properly, don't sleep(1)
From: |
Markus Armbruster |
Subject: |
[PATCH v2 05/11] test-util-sockets: Synchronize properly, don't sleep(1) |
Date: |
Mon, 2 Nov 2020 10:44:16 +0100 |
The abstract sockets test spawns a thread to listen and accept, and a
second one to connect, with a sleep(1) in between to "ensure" the
former is listening when the latter tries to connect. Review fail.
Risks spurious test failure, say when a heavily loaded machine doesn't
schedule the first thread quickly enough. It's also slow.
Listen and accept in the main thread, and start the connect thread in
between. Look ma, no sleep! Run time drops from 2s wall clock to a
few milliseconds.
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
tests/test-util-sockets.c | 40 +++++++++++++--------------------------
1 file changed, 13 insertions(+), 27 deletions(-)
diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 40ff893e64..4cedf622f0 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -230,26 +230,6 @@ static void test_socket_fd_pass_num_nocli(void)
#endif
#ifdef __linux__
-static gpointer unix_server_thread_func(gpointer user_data)
-{
- SocketAddress *addr = user_data;
- int fd;
- int connfd;
- struct sockaddr_un un;
- socklen_t len = sizeof(un);
-
- fd = socket_listen(addr, 1, &error_abort);
- g_assert_cmpint(fd, >=, 0);
- g_assert(fd_is_socket(fd));
-
- connfd = accept(fd, (struct sockaddr *)&un, &len);
- g_assert_cmpint(connfd, !=, -1);
- close(connfd);
-
- close(fd);
- return NULL;
-}
-
static gpointer unix_client_thread_func(gpointer user_data)
{
SocketAddress *addr = user_data;
@@ -263,20 +243,26 @@ static gpointer unix_client_thread_func(gpointer
user_data)
static void test_socket_unix_abstract_one(SocketAddress *addr)
{
- GThread *serv, *cli;
+ int fd, connfd;
+ GThread *cli;
+ struct sockaddr_un un;
+ socklen_t len = sizeof(un);
- serv = g_thread_new("abstract_unix_server",
- unix_server_thread_func,
- addr);
-
- sleep(1);
+ fd = socket_listen(addr, 1, &error_abort);
+ g_assert_cmpint(fd, >=, 0);
+ g_assert(fd_is_socket(fd));
cli = g_thread_new("abstract_unix_client",
unix_client_thread_func,
addr);
+ connfd = accept(fd, (struct sockaddr *)&un, &len);
+ g_assert_cmpint(connfd, !=, -1);
+ close(connfd);
+
+ close(fd);
+
g_thread_join(cli);
- g_thread_join(serv);
}
static void test_socket_unix_abstract_good(void)
--
2.26.2
- [PATCH v2 02/11] test-util-sockets: Correct to set has_abstract, has_tight, (continued)
- [PATCH v2 02/11] test-util-sockets: Correct to set has_abstract, has_tight, Markus Armbruster, 2020/11/02
- [PATCH v2 06/11] test-util-sockets: Test the complete abstract socket matrix, Markus Armbruster, 2020/11/02
- [PATCH v2 01/11] test-util-sockets: Plug file descriptor leak, Markus Armbruster, 2020/11/02
- [PATCH v2 08/11] sockets: Fix socket_sockaddr_to_address_unix() for abstract sockets, Markus Armbruster, 2020/11/02
- [PATCH v2 03/11] test-util-sockets: Clean up SocketAddress construction, Markus Armbruster, 2020/11/02
- [PATCH v2 10/11] sockets: Bypass "replace empty @path" for abstract unix sockets, Markus Armbruster, 2020/11/02
- [PATCH v2 04/11] test-util-sockets: Factor out test_socket_unix_abstract_one(), Markus Armbruster, 2020/11/02
- [PATCH v2 07/11] sockets: Fix default of UnixSocketAddress member @tight, Markus Armbruster, 2020/11/02
- [PATCH v2 05/11] test-util-sockets: Synchronize properly, don't sleep(1),
Markus Armbruster <=
- [PATCH v2 09/11] char-socket: Fix qemu_chr_socket_address() for abstract sockets, Markus Armbruster, 2020/11/02
[PATCH v2 11/11] sockets: Make abstract UnixSocketAddress depend on CONFIG_LINUX, Markus Armbruster, 2020/11/02