Changeset

10996:d742095046f9

net.cqueues: Switch to server.watchfd for main loop integration Why? Just look at all that code deleted! watchfd is the prefered way to poll things that expose FDs for this purpose, altho it was added after net.cqueues.
author Kim Alvefur <zash@zash.se>
date Wed, 08 Jul 2020 20:11:49 +0200
parents 10995:e18a913aed2d
children 10997:2451e3918c2c
files net/cqueues.lua
diffstat 1 files changed, 2 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/net/cqueues.lua	Tue Jul 07 13:52:45 2020 +0100
+++ b/net/cqueues.lua	Wed Jul 08 20:11:49 2020 +0200
@@ -16,55 +16,11 @@
 
 if server.cq then -- server provides cqueues object
 	cq = server.cq;
-elseif server.get_backend() == "select" and server._addtimer then -- server_select
+elseif server.watchfd then
 	cq = cqueues.new();
-	local function step()
+	server.watchfd(cq:pollfd(), function ()
 		assert(cq:loop(0));
-	end
-
-	-- Use wrapclient (as wrapconnection isn't exported) to get server_select to watch cq fd
-	local handler = server.wrapclient({
-		getfd = function() return cq:pollfd(); end;
-		settimeout = function() end; -- Method just needs to exist
-		close = function() end; -- Need close method for 'closeall'
-	}, nil, nil, {});
-
-	-- Only need to listen for readable; cqueues handles everything under the hood
-	-- readbuffer is called when `select` notes an fd as readable
-	handler.readbuffer = step;
-
-	-- Use server_select low lever timer facility,
-	-- this callback gets called *every* time there is a timeout in the main loop
-	server._addtimer(function(current_time)
-		-- This may end up in extra step()'s, but cqueues handles it for us.
-		step();
-		return cq:timeout();
 	end);
-elseif server.event and server.base then -- server_event
-	cq = cqueues.new();
-	-- Only need to listen for readable; cqueues handles everything under the hood
-	local EV_READ = server.event.EV_READ;
-	-- Convert a cqueues timeout to an acceptable timeout for luaevent
-	local function luaevent_safe_timeout(cq)
-		local t = cq:timeout();
-		-- if you give luaevent 0 or nil, it re-uses the previous timeout.
-		if t == 0 then
-			t = 0.000001; -- 1 microsecond is the smallest that works (goes into a `struct timeval`)
-		elseif t == nil then -- pick something big if we don't have one
-			t = 0x7FFFFFFF; -- largest 32bit int
-		end
-		return t
-	end
-	local event_handle;
-	event_handle = server.base:addevent(cq:pollfd(), EV_READ, function(e)
-			-- Need to reference event_handle or this callback will get collected
-			-- This creates a circular reference that can only be broken if event_handle is manually :close()'d
-			local _ = event_handle;
-			-- Run as many cqueues things as possible (with a timeout of 0)
-			-- If an error is thrown, it will break the libevent loop; but prosody resumes after logging a top level error
-			assert(cq:loop(0));
-			return EV_READ, luaevent_safe_timeout(cq);
-		end, luaevent_safe_timeout(cq));
 else
 	error "NYI"
 end