]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add the worker directly to the network thread
authorAlan T. DeKok <aland@freeradius.org>
Wed, 30 Oct 2024 13:44:36 +0000 (09:44 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 30 Oct 2024 13:45:23 +0000 (09:45 -0400)
@todo - perhaps assert that we don't mix "same-thread" workers
with "different-thread" workers?

src/lib/io/network.c
src/lib/io/network.h
src/lib/io/schedule.c

index b79e09f4326444a0dadc777e0489ebf6f97e97db..9c7f4c54b722cd39885a1ac1a8a7e1684ed4262b 100644 (file)
@@ -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
index b3816649e7c40f21f8b4b9f60a83b726bdd53719..89545a6bcac09bdd98a7a59b50aab282ac656ced 100644 (file)
@@ -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,
index 418c9ccee5783c0a1d47d19258802f257f3069ee..5f85964fe7b49c741b07ec97a8a9aec32345a67f 100644 (file)
@@ -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) {