author | Matthew Wild <mwild1@gmail.com> |
Wed, 27 Mar 2024 15:39:03 +0000 | |
changeset 13470 | 5d9ec2e55d74 |
parent 12978 | ba409c67353b |
permissions | -rw-r--r-- |
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 |
} |