net/cqueues.lua
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 21:32:00 +0100
changeset 13468 2dbc169aae6a
parent 12978 ba409c67353b
permissions -rw-r--r--
util.startup: Abort before initialization of logging when started as root Prevents creation of log files owned by the root user which could be inaccessible once started correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6517
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     1
-- Prosody IM
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     2
-- Copyright (C) 2014 Daurnimator
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     3
--
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     4
-- This project is MIT/X11 licensed. Please see the
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     5
-- COPYING file in the source package for more information.
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     6
--
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     7
-- This module allows you to use cqueues with a net.server mainloop
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     8
--
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     9
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11003
diff changeset
    10
local server = require "prosody.net.server";
6517
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    11
local cqueues = require "cqueues";
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11003
diff changeset
    12
local timer = require "prosody.util.timer";
6541
f1eb66288f60 net.cqueues: Fix incorrect version check
daurnimator <quae@daurnimator.com>
parents: 6540
diff changeset
    13
assert(cqueues.VERSION >= 20150113, "cqueues newer than 20150113 required")
6517
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    14
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    15
-- Create a single top level cqueue
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    16
local cq;
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    17
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    18
if server.cq then -- server provides cqueues object
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    19
	cq = server.cq;
11000
d742095046f9 net.cqueues: Switch to server.watchfd for main loop integration
Kim Alvefur <zash@zash.se>
parents: 6541
diff changeset
    20
elseif server.watchfd then
6517
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    21
	cq = cqueues.new();
11003
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    22
	local timeout = timer.add_task(cq:timeout() or 0, function ()
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    23
		-- FIXME It should be enough to reschedule this timeout instead of replacing it, but this does not work.  See https://issues.prosody.im/1572
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    24
		assert(cq:loop(0));
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    25
		return cq:timeout();
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    26
	end);
11000
d742095046f9 net.cqueues: Switch to server.watchfd for main loop integration
Kim Alvefur <zash@zash.se>
parents: 6541
diff changeset
    27
	server.watchfd(cq:pollfd(), function ()
6517
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    28
		assert(cq:loop(0));
11003
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    29
		local t = cq:timeout();
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    30
		if t then
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    31
			timer.stop(timeout);
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    32
			timeout = timer.add_task(cq:timeout(), function ()
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    33
				assert(cq:loop(0));
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    34
				return cq:timeout();
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    35
			end);
37b884d675f7 net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents: 11000
diff changeset
    36
		end
6517
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    37
	end);
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    38
else
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    39
	error "NYI"
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    40
end
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    41
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    42
return {
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    43
	cq = cq;
d425fc41e59f net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    44
}