commit 6072828d8f78310b331c4fdcf50e5257b85ff801
parent d86a10afa10b7dc15f736f9780ec177269ff02b1
Author: Joris Vink <joris@coders.se>
Date: Fri, 24 Jan 2020 19:36:32 +0100
Improve BSD platform event code.
Instead of adding all listening sockets into the kqueue at platform init,
do it in the first call to kore_platform_enable_accept().
This way a worker process can still call kore_server_create() in its
kore_worker_configure() hook.
Diffstat:
1 file changed, 10 insertions(+), 16 deletions(-)
diff --git a/src/bsd.c b/src/bsd.c
@@ -38,6 +38,7 @@
#endif
static int kfd = -1;
+static int scheduled = 0;
static struct kevent *events = NULL;
static u_int32_t event_count = 0;
@@ -78,9 +79,6 @@ kore_platform_worker_setcpu(struct kore_worker *kw)
void
kore_platform_event_init(void)
{
- struct listener *l;
- struct kore_server *srv;
-
if (kfd != -1)
close(kfd);
if (events != NULL)
@@ -91,18 +89,6 @@ kore_platform_event_init(void)
event_count = (worker_max_connections * 2) + nlisteners;
events = kore_calloc(event_count, sizeof(struct kevent));
-
- /* Hack to check if we're running under the parent or not. */
- if (worker != NULL) {
- LIST_FOREACH(srv, &kore_servers, list) {
- LIST_FOREACH(l, &srv->listeners, list) {
- if (l->fd == -1)
- continue;
- kore_platform_event_schedule(l->fd,
- EVFILT_READ, EV_ADD | EV_DISABLE, l);
- }
- }
- }
}
void
@@ -188,11 +174,19 @@ kore_platform_enable_accept(void)
{
struct listener *l;
struct kore_server *srv;
+ int flags;
+
+ if (scheduled == 0) {
+ scheduled = 1;
+ flags = EV_ADD | EV_ENABLE;
+ } else {
+ flags = EV_ENABLE;
+ }
LIST_FOREACH(srv, &kore_servers, list) {
LIST_FOREACH(l, &srv->listeners, list) {
kore_platform_event_schedule(l->fd,
- EVFILT_READ, EV_ENABLE, l);
+ EVFILT_READ, flags, l);
}
}
}