From 4330cdee74c86a383055d788de43fd4ae2bd7bc2 Mon Sep 17 00:00:00 2001 From: Dan Klishch Date: Mon, 29 Jan 2024 19:48:51 -0500 Subject: [PATCH] Tests/Kernel: Properly synchronize threads in TestTCPSocket We should wait for a server thread to actually listen(2) a server socket before trying to connect to it. This hopefully should make the test less flaky. --- Tests/Kernel/TestTCPSocket.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Tests/Kernel/TestTCPSocket.cpp b/Tests/Kernel/TestTCPSocket.cpp index fcabcd1504..3451033c50 100644 --- a/Tests/Kernel/TestTCPSocket.cpp +++ b/Tests/Kernel/TestTCPSocket.cpp @@ -9,11 +9,12 @@ #include #include #include +#include #include static constexpr u16 port = 1337; -static void* server_handler(void*) +static void* server_handler(void* accept_semaphore) { int server_fd = socket(AF_INET, SOCK_STREAM, 0); EXPECT(server_fd >= 0); @@ -28,6 +29,9 @@ static void* server_handler(void*) rc = listen(server_fd, 1); EXPECT_EQ(rc, 0); + rc = sem_post(reinterpret_cast(accept_semaphore)); + VERIFY(rc == 0); + int client_fd = accept(server_fd, nullptr, nullptr); EXPECT(client_fd >= 0); @@ -49,8 +53,16 @@ static void* server_handler(void*) static pthread_t start_tcp_server() { pthread_t thread; - int rc = pthread_create(&thread, nullptr, server_handler, nullptr); - EXPECT_EQ(rc, 0); + sem_t accept_semaphore; + + int rc = sem_init(&accept_semaphore, 0, 0); + VERIFY(rc == 0); + rc = pthread_create(&thread, nullptr, server_handler, &accept_semaphore); + VERIFY(rc == 0); + rc = sem_wait(&accept_semaphore); + VERIFY(rc == 0); + rc = sem_destroy(&accept_semaphore); + VERIFY(rc == 0); return thread; }