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"