Software /
code /
prosody
Changeset
10999:37b884d675f7
net.cqueues: Fix resuming after timeouts
net.cqueues previously relied on timers instead of fd events sometimes.
Under net.server_select, it would have called cq:loop() on every
iteration of the main loop, which was probably not optimal.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 08 Jul 2020 22:01:19 +0200 |
parents | 10998:f3fc0f799dc4 |
children | 11000:d9aae4734f38 |
files | net/cqueues.lua |
diffstat | 1 files changed, 14 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/net/cqueues.lua Wed Jul 08 21:39:10 2020 +0200 +++ b/net/cqueues.lua Wed Jul 08 22:01:19 2020 +0200 @@ -9,6 +9,7 @@ local server = require "net.server"; local cqueues = require "cqueues"; +local timer = require "util.timer"; assert(cqueues.VERSION >= 20150113, "cqueues newer than 20150113 required") -- Create a single top level cqueue @@ -18,8 +19,21 @@ cq = server.cq; elseif server.watchfd then cq = cqueues.new(); + local timeout = timer.add_task(cq:timeout() or 0, function () + -- FIXME It should be enough to reschedule this timeout instead of replacing it, but this does not work. See https://issues.prosody.im/1572 + assert(cq:loop(0)); + return cq:timeout(); + end); server.watchfd(cq:pollfd(), function () assert(cq:loop(0)); + local t = cq:timeout(); + if t then + timer.stop(timeout); + timeout = timer.add_task(cq:timeout(), function () + assert(cq:loop(0)); + return cq:timeout(); + end); + end end); else error "NYI"