Mercurial > prosody-hg
annotate util/smqueue.lua @ 14204:b226d326223d
Merge 13.0->trunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 28 May 2026 12:35:37 +0100 |
| parents | 73903352de86 |
| children |
| rev | line source |
|---|---|
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
1 -- This file is generated from teal-src/prosody/util/smqueue.tl |
|
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12058
diff
changeset
|
2 local queue = require("prosody.util.queue"); |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
4 local lib = { smqueue = {} } |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
5 |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
6 local smqueue = lib.smqueue; |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 function smqueue:push(v) |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 self._head = self._head + 1; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 assert(self._queue:push(v)); |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 function smqueue:ack(h) |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 if h < self._tail then |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
16 |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 return nil, "tail" |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 elseif h > self._head then |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
19 |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 return nil, "head" |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 local acked = {}; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 self._tail = h; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 local expect = self._head - self._tail; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 while expect < self._queue:count() do |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 local v = self._queue:pop(); |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
28 if not v then |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
29 return nil, "pop" |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
30 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 table.insert(acked, v); |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 end |
|
13994
8baaefc4db79
util.smqueue: Minor reformatting for code style, add some comments
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
33 |
|
14198
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
34 self:_call_checkpoints(h); |
|
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
35 |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 return acked |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
39 function smqueue:count_unacked() |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
40 return self._head - self._tail |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
41 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
43 function smqueue:count_acked() |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
44 return self._tail |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
45 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
47 function smqueue:resumable() |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
48 return self._queue:count() >= (self._head - self._tail) |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
49 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
51 function smqueue:resume() |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
52 return self._queue:items() |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
53 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
55 function smqueue:consume() |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
56 return self._queue:consume() |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
57 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 |
|
12058
4860da718e87
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12055
diff
changeset
|
59 function smqueue:table() |
|
4860da718e87
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12055
diff
changeset
|
60 local t = {}; |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
61 for i, v in self:resume() do |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
62 t[i] = v; |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
63 end |
|
12058
4860da718e87
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12055
diff
changeset
|
64 return t |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 |
|
14001
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
67 function smqueue:add_checkpoint(cb, ud) |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
68 table.insert(self._checkpoints, { self._head; cb; ud }); |
|
14001
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
69 end |
|
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
70 |
|
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
71 function smqueue:_call_checkpoints(h) |
|
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
72 local checkpoints = self._checkpoints; |
|
14198
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
73 local c = checkpoints[1]; |
|
14001
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
74 |
|
14198
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
75 while c and h >= c[1] do |
|
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
76 table.remove(checkpoints, 1); |
|
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
77 local cb, ud = c[2], c[3]; |
|
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
78 cb(ud); |
|
73903352de86
util.smqueue: Refactor checkpoint logic and add tests
Matthew Wild <mwild1@gmail.com>
parents:
14017
diff
changeset
|
79 c = checkpoints[1]; |
|
14001
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
80 end |
|
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
81 end |
|
df970d2dac45
util.smqueue: Add "checkpoints" API to run code on successful stanza delivery
Matthew Wild <mwild1@gmail.com>
parents:
13994
diff
changeset
|
82 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
83 local function freeze(q) |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
84 return { head = q._head; tail = q._tail } |
|
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
85 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
87 local smqueue_mt = { __name = "smqueue"; __index = smqueue; __len = smqueue.count_unacked; __freeze = freeze } |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 function lib.new(size) |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 assert(size > 0); |
|
14017
1e01b91cf94d
util.smqueue: Backport changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
14008
diff
changeset
|
91 return setmetatable({ _head = 0; _tail = 0; _queue = queue.new(size, true); _checkpoints = {} }, smqueue_mt) |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 return lib |
