]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Use a semaphore to ensure master thread has started before workers
authorNick Porter <nick@portercomputing.co.uk>
Thu, 19 Feb 2026 19:40:57 +0000 (19:40 +0000)
committerNick Porter <nick@portercomputing.co.uk>
Fri, 13 Mar 2026 09:55:58 +0000 (09:55 +0000)
src/tests/util/control_test.c

index bffd0fd2831e698865a5e92a4ed6243323922d54..ec016b71088a9227871f7a05f0089a2daf98acf3 100644 (file)
@@ -27,6 +27,7 @@ RCSID("$Id$")
 #include <freeradius-devel/util/debug.h>
 #include <freeradius-devel/util/syserror.h>
 #include <freeradius-devel/util/talloc.h>
+#include <freeradius-devel/util/semaphore.h>
 
 #include <sys/event.h>
 #include <pthread.h>
@@ -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();