mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
44 lines
1.1 KiB
Lua
44 lines
1.1 KiB
Lua
-- 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;
|
|
}
|