diff options
author | Kim Alvefur <zash@zash.se> | 2023-01-06 04:38:39 +0100 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2023-01-06 04:38:39 +0100 |
commit | f5006b12024db1c76601cfe69960788a254c2b26 (patch) | |
tree | 660b015d01f4eabc2b336996c9c68e8275ef6b95 /net | |
parent | net.server_epoll: Factor out single main loop step into its own function (diff) | |
download | prosody-f5006b12024db1c76601cfe69960788a254c2b26.tar.xz prosody-f5006b12024db1c76601cfe69960788a254c2b26.zip |
net.server_epoll: Remove delay on last main loop iteration when quitting
Main difference is that timers are not checked unconditionally before
each poll, only when running out of previous poll results (hidden by
util.poll). This removes a final poll at shutdown that usually delays
the 'not quitting' condition check by one second.
Diffstat (limited to 'net')
-rw-r--r-- | net/server_epoll.lua | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/net/server_epoll.lua b/net/server_epoll.lua index 66a60b5e0..c7ab0c13e 100644 --- a/net/server_epoll.lua +++ b/net/server_epoll.lua @@ -1109,10 +1109,11 @@ local function loop(once) return loop_once(); end - repeat - local t = runtimers(cfg.max_wait, cfg.min_wait); + local t = 0; + while not quitting do local fd, r, w = poll:wait(t); - while fd do + if fd then + t = 0; local conn = fds[fd]; if conn then if r then @@ -1125,12 +1126,12 @@ local function loop(once) log("debug", "Removing unknown fd %d", fd); poll:del(fd); end - fd, r, w = poll:wait(0); - end - if r ~= "timeout" and r ~= "signal" then + elseif r == "timeout" then + t = runtimers(cfg.max_wait, cfg.min_wait); + elseif r ~= "signal" then log("debug", "epoll_wait error: %s[%d]", r, w); end - until (quitting and next(fds) == nil); + end return quitting; end |