From 39458d4e3059d37e3331258a50fd77f8cf5b365e Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 2 Nov 2020 10:44:16 +0100 Subject: [PATCH] test-util-sockets: Synchronize properly, don't sleep(1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Eric Blake Signed-off-by: Markus Armbruster Signed-off-by: Daniel P. Berrangé --- 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; - - serv = g_thread_new("abstract_unix_server", - unix_server_thread_func, - addr); + int fd, connfd; + GThread *cli; + struct sockaddr_un un; + socklen_t len = sizeof(un); - 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.30.2