1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
-- Prosody IM
-- Copyright (C) 2014 Daurnimator
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
-- This module allows you to use cqueues with a net.server mainloop
--
local server = require "prosody.net.server";
local cqueues = require "cqueues";
local timer = require "prosody.util.timer";
assert(cqueues.VERSION >= 20150113, "cqueues newer than 20150113 required")
-- Create a single top level cqueue
local cq;
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"
end
return {
cq = cq;
}
|