Mercurial > prosody-hg
comparison net/server_epoll.lua @ 11858:2bcd84123eba
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
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 21 Oct 2021 15:59:16 +0200 |
| parents | 19b50ce9ef5a |
| children | ff4e34c448a4 |
comparison
equal
deleted
inserted
replaced
| 11857:e080d6aa0b3b | 11858:2bcd84123eba |
|---|---|
| 1031 -- Main loop | 1031 -- Main loop |
| 1032 local function loop(once) | 1032 local function loop(once) |
| 1033 repeat | 1033 repeat |
| 1034 local t = runtimers(cfg.max_wait, cfg.min_wait); | 1034 local t = runtimers(cfg.max_wait, cfg.min_wait); |
| 1035 local fd, r, w = poll:wait(t); | 1035 local fd, r, w = poll:wait(t); |
| 1036 if fd then | 1036 while fd do |
| 1037 local conn = fds[fd]; | 1037 local conn = fds[fd]; |
| 1038 if conn then | 1038 if conn then |
| 1039 if r then | 1039 if r then |
| 1040 conn:onreadable(); | 1040 conn:onreadable(); |
| 1041 end | 1041 end |
| 1044 end | 1044 end |
| 1045 else | 1045 else |
| 1046 log("debug", "Removing unknown fd %d", fd); | 1046 log("debug", "Removing unknown fd %d", fd); |
| 1047 poll:del(fd); | 1047 poll:del(fd); |
| 1048 end | 1048 end |
| 1049 elseif r ~= "timeout" and r ~= "signal" then | 1049 fd, r, w = poll:wait(0); |
| 1050 end | |
| 1051 if r ~= "timeout" and r ~= "signal" then | |
| 1050 log("debug", "epoll_wait error: %s[%d]", r, w); | 1052 log("debug", "epoll_wait error: %s[%d]", r, w); |
| 1051 end | 1053 end |
| 1052 until once or (quitting and next(fds) == nil); | 1054 until once or (quitting and next(fds) == nil); |
| 1053 return quitting; | 1055 return quitting; |
| 1054 end | 1056 end |
