aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/cqueues.lua14
1 files changed, 14 insertions, 0 deletions
diff --git a/net/cqueues.lua b/net/cqueues.lua
index 84d59f15..65d2a019 100644
--- a/net/cqueues.lua
+++ b/net/cqueues.lua
@@ -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 @@ if server.cq then -- server provides cqueues object
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"