From: Alan T. DeKok Date: Wed, 30 Oct 2024 13:44:36 +0000 (-0400) Subject: add the worker directly to the network thread X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ccf1b700bb76d57fe6dcfb5f4869f7c11090785;p=thirdparty%2Ffreeradius-server.git add the worker directly to the network thread @todo - perhaps assert that we don't mix "same-thread" workers with "different-thread" workers? --- diff --git a/src/lib/io/network.c b/src/lib/io/network.c index b79e09f4326..9c7f4c54b72 100644 --- a/src/lib/io/network.c +++ b/src/lib/io/network.c @@ -285,7 +285,7 @@ int fr_network_directory_add(fr_network_t *nr, fr_listen_t *li) return fr_control_message_send(nr->control, rb, FR_CONTROL_ID_DIRECTORY, &li, sizeof(li)); } -/** Add a worker to a network +/** Add a worker to a network in a different thread * * @param nr the network * @param worker the worker @@ -303,6 +303,19 @@ int fr_network_worker_add(fr_network_t *nr, fr_worker_t *worker) return fr_control_message_send(nr->control, rb, FR_CONTROL_ID_WORKER, &worker, sizeof(worker)); } +static void fr_network_worker_started_callback(void *ctx, void const *data, size_t data_size, fr_time_t now); + +/** Add a worker to a network in the same thread + * + * @param nr the network + * @param worker the worker + */ +void fr_network_worker_add_self(fr_network_t *nr, fr_worker_t *worker) +{ + fr_network_worker_started_callback(nr, &worker, sizeof(worker), fr_time_wrap(0)); +} + + /** Signal the network to read from a listener * * @param nr the network diff --git a/src/lib/io/network.h b/src/lib/io/network.h index b3816649e7c..89545a6bcac 100644 --- a/src/lib/io/network.h +++ b/src/lib/io/network.h @@ -54,6 +54,8 @@ int fr_network_directory_add(fr_network_t *nr, fr_listen_t *li) CC_HINT(nonnull int fr_network_worker_add(fr_network_t *nr, fr_worker_t *worker) CC_HINT(nonnull); +void fr_network_worker_add_self(fr_network_t *nr, fr_worker_t *worker) CC_HINT(nonnull); + void fr_network_listen_read(fr_network_t *nr, fr_listen_t *li) CC_HINT(nonnull); void fr_network_listen_write(fr_network_t *nr, fr_listen_t *li, uint8_t const *packet, size_t packet_len, diff --git a/src/lib/io/schedule.c b/src/lib/io/schedule.c index 418c9ccee57..5f85964fe7b 100644 --- a/src/lib/io/schedule.c +++ b/src/lib/io/schedule.c @@ -535,7 +535,11 @@ fr_schedule_t *fr_schedule_create(TALLOC_CTX *ctx, fr_event_list_t *el, goto st_fail; } - (void) fr_network_worker_add(sc->single_network, sc->single_worker); + /* + * Register the worker with the network, so + * things like fr_network_send_request() work. + */ + fr_network_worker_add_self(sc->single_network, sc->single_worker); DEBUG("Scheduler created in single-threaded mode"); if (fr_event_pre_insert(el, fr_worker_pre_event, sc->single_worker) < 0) {