From 2408c299f020c5132edfc78a3566de83aa729f91 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Thu, 21 Oct 2021 15:59:16 +0200 Subject: net.server_epoll: Process all queued events from epoll before timers Should call timers less frequently when many sockets are waiting for processing. May help under heavy load. Requested by Ge0rG --- net/server_epoll.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'net') diff --git a/net/server_epoll.lua b/net/server_epoll.lua index e4fea5c1..0a0f89c5 100644 --- a/net/server_epoll.lua +++ b/net/server_epoll.lua @@ -1033,7 +1033,7 @@ local function loop(once) repeat local t = runtimers(cfg.max_wait, cfg.min_wait); local fd, r, w = poll:wait(t); - if fd then + while fd do local conn = fds[fd]; if conn then if r then @@ -1046,7 +1046,9 @@ local function loop(once) log("debug", "Removing unknown fd %d", fd); poll:del(fd); end - elseif r ~= "timeout" and r ~= "signal" then + fd, r, w = poll:wait(0); + end + if r ~= "timeout" and r ~= "signal" then log("debug", "epoll_wait error: %s[%d]", r, w); end until once or (quitting and next(fds) == nil); -- cgit v1.2.3