From f7fc8d8d75a2528c01109254c459c54848b83921 Mon Sep 17 00:00:00 2001 From: Glenn Strauss Date: Sat, 3 Oct 2020 03:10:40 -0400 Subject: [PATCH] [core] connection_joblist global con->srv->joblist is expensive to traverse when cache is cold and called from connection_handle_fdevent(); var made a global --- src/base.h | 1 - src/connections-glue.c | 2 ++ src/connections.h | 3 ++- src/server.c | 6 +++--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/base.h b/src/base.h index bd42b186..3ae04751 100644 --- a/src/base.h +++ b/src/base.h @@ -158,7 +158,6 @@ struct server { buffer *tmp_buf; connections conns; - connections *joblist; connections joblist_A; connections joblist_B; connections fdwaitqueue; diff --git a/src/connections-glue.c b/src/connections-glue.c index bfe276a0..2c1b0537 100644 --- a/src/connections-glue.c +++ b/src/connections-glue.c @@ -5,6 +5,8 @@ #include +connections *connection_joblist; + __attribute_cold__ static void connection_list_resize(connections *conns) { conns->size += 16; diff --git a/src/connections.h b/src/connections.h index e0be36f5..030ac6b9 100644 --- a/src/connections.h +++ b/src/connections.h @@ -19,7 +19,8 @@ connection * connection_accepted(server *srv, server_socket *srv_socket, sock_ad void connection_state_machine(connection *con); -#define joblist_append(con) connection_list_append((con)->srv->joblist, (con)) +extern connections *connection_joblist; +#define joblist_append(con) connection_list_append(connection_joblist, (con)) void connection_list_append(connections *conns, connection *con); #endif diff --git a/src/server.c b/src/server.c index 92a4ff98..c019044c 100644 --- a/src/server.c +++ b/src/server.c @@ -239,7 +239,7 @@ static server *server_init(void) { CLEAN(tmp_buf); #undef CLEAN - srv->joblist = &srv->joblist_A; + connection_joblist = &srv->joblist_A; strftime_cache_reset(); @@ -1856,13 +1856,13 @@ static void server_main_loop (server * const srv) { server_process_fdwaitqueue(srv); } - connections * const joblist = srv->joblist; + connections * const joblist = connection_joblist; if (fdevent_poll(srv->ev, joblist->used ? 0 : 1000) > 0) { last_active_ts = log_epoch_secs; } - srv->joblist = (joblist == &srv->joblist_A) + connection_joblist = (joblist == &srv->joblist_A) ? &srv->joblist_B : &srv->joblist_A;