Mercurial > prosody-hg
annotate teal-src/prosody/util/smqueue.tl @ 13946:f5e8ab42c708
mod_http_file_share: Check that files are still there with correct size
Failed uploads can leave behind unused slots. Files shouldn't change
size after they have been successfully uploaded, but might as well
double check it.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 04 Dec 2021 18:56:51 +0100 |
| parents | 9ec961173b1c |
| children | 1e01b91cf94d |
| rev | line source |
|---|---|
|
12979
fbbf4f0db8f0
teal: Move into prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12058
diff
changeset
|
1 local queue = require "prosody.util.queue"; |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 local record lib |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 -- T would typically be util.stanza |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 record smqueue<T> |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 _queue : queue.queue<T> |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 _head : integer |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 _tail : integer |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 enum ack_errors |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 "tail" |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 "head" |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 "pop" |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 end |
|
13857
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
15 push : function (smqueue<T>, T) |
|
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
16 ack : function (smqueue<T>, integer) : { T }, ack_errors |
|
12057
e880f5a13080
util.smqueue: Add missing method to Teal record spec
Kim Alvefur <zash@zash.se>
parents:
12055
diff
changeset
|
17 resumable : function (smqueue<T>) : boolean |
|
e880f5a13080
util.smqueue: Add missing method to Teal record spec
Kim Alvefur <zash@zash.se>
parents:
12055
diff
changeset
|
18 resume : function (smqueue<T>) : queue.queue.iterator, any, integer |
|
13857
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
19 consume : function (smqueue<T>) : function() : T |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 table : function (smqueue<T>) : { T } |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 new : function <T>(integer) : smqueue<T> |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 local type smqueue = lib.smqueue; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
|
13857
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
28 function smqueue:push(v : T) |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 self._head = self._head + 1; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 -- Wraps instead of errors |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 assert(self._queue:push(v)); |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 |
|
13857
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
34 function smqueue:ack(h : integer) : { T }, smqueue.ack_errors |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 if h < self._tail then |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
36 return nil, "tail" |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 elseif h > self._head then |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
38 return nil, "head" |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 -- TODO optimize? cache table fields |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 local acked = {}; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 self._tail = h; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 local expect = self._head - self._tail; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 while expect < self._queue:count() do |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 local v = self._queue:pop(); |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
46 if not v then |
|
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
47 return nil, "pop" |
|
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
48 end |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 table.insert(acked, v); |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 end |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
51 return acked |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 function smqueue:count_unacked() : integer |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
55 return self._head - self._tail |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 function smqueue:count_acked() : integer |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
59 return self._tail |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 function smqueue:resumable() : boolean |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
63 return self._queue:count() >= (self._head - self._tail) |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 function smqueue:resume() : queue.queue.iterator, any, integer |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
67 return self._queue:items() |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 |
|
13857
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
70 function smqueue:consume() : (function() : T) |
|
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
71 return self._queue:consume() as (function() : T) |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 |
|
12058
4860da718e87
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12057
diff
changeset
|
74 -- Compatibility layer, plain ol' table |
|
13857
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
75 function smqueue:table() : { T } |
|
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
76 local t : { T } = {}; |
|
12058
4860da718e87
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12057
diff
changeset
|
77 for i, v in self:resume() do |
|
4860da718e87
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12057
diff
changeset
|
78 t[i] = v; |
|
4860da718e87
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12057
diff
changeset
|
79 end |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
80 return t |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 local function freeze(q : smqueue<any>) : { string:integer } |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 return { head = q._head, tail = q._tail } |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 local queue_mt = { |
|
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 __name = "smqueue"; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 __index = smqueue; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 __len = smqueue.count_unacked; |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 __freeze = freeze; |
|
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 |
|
13857
fc6495c887f6
util.smqueue: Clean up syntax errors and warnings from Teal 0.24
Kim Alvefur <zash@zash.se>
parents:
12979
diff
changeset
|
95 function lib.new<T>(size : integer) : smqueue<T> |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 assert(size>0); |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
97 return setmetatable({ _head = 0; _tail = 0; _queue = queue.new(size, true) }, queue_mt) |
|
12055
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 end |
|
daced16154fa
util.smqueue: Abstract queue with acknowledgements and overflow
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 |
|
13878
9ec961173b1c
teal: Remove trailing semicolons after return
Kim Alvefur <zash@zash.se>
parents:
13857
diff
changeset
|
100 return lib |
