From: Nick Porter Date: Thu, 19 Feb 2026 19:40:57 +0000 (+0000) Subject: Use a semaphore to ensure master thread has started before workers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=18b7e8e308c082921097de221514c22afdd03e9f;p=thirdparty%2Ffreeradius-server.git Use a semaphore to ensure master thread has started before workers --- diff --git a/src/tests/util/control_test.c b/src/tests/util/control_test.c index bffd0fd2831..ec016b71088 100644 --- a/src/tests/util/control_test.c +++ b/src/tests/util/control_test.c @@ -27,6 +27,7 @@ RCSID("$Id$") #include #include #include +#include #include #include @@ -93,12 +94,13 @@ static void recv_control_callback(void *ctx, void const *data, size_t data_size, master_ctx->num_messages++; } -static void *control_master(UNUSED void *arg) +static void *control_master(void *arg) { TALLOC_CTX *ctx; master_ctx_t *master_ctx; size_t i; fr_time_t start; + fr_sem_t *master_sem = arg; MEM(ctx = talloc_init_const("control_master")); @@ -111,6 +113,8 @@ static void *control_master(UNUSED void *arg) fr_control_open(control[i]); } + sem_post(master_sem); + start = fr_time(); while (master_ctx->num_messages < (max_messages * num_workers)) { int num_events; @@ -188,6 +192,7 @@ int main(int argc, char *argv[]) pthread_t master_id, *worker_id; size_t i; worker_args_t *worker_args; + fr_sem_t *master_sem; fr_time_start(); @@ -244,7 +249,11 @@ int main(int argc, char *argv[]) (void) pthread_attr_init(&attr); (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - (void) pthread_create(&master_id, &attr, control_master, NULL); + master_sem = fr_sem_alloc(); + fr_assert(master_sem != NULL); + (void) pthread_create(&master_id, &attr, control_master, master_sem); + SEM_WAIT_INTR(master_sem); + worker_id = talloc_array(autofree, pthread_t, num_workers); worker_args = talloc_array(autofree, worker_args_t, num_workers); for (i = 0; i < num_workers; i++) { @@ -258,6 +267,7 @@ int main(int argc, char *argv[]) (void) pthread_join(worker_id[i], NULL); } + fr_sem_free(master_sem); talloc_free(control); main_loop_free();