util.timer: Keep count of how many timer instances are active
[prosody.git] / util / queue.lua
index afdcaf453e22d7d7898de4e28e6655edce16b0d6..728e905f001875191ad71a347ee0ad9714fe14b4 100644 (file)
 
 local have_utable, utable = pcall(require, "util.table"); -- For pre-allocation of table
 
-local function new(size)
+local function new(size, allow_wrapping)
        -- Head is next insert, tail is next read
        local head, tail = 1, 1;
        local items = 0; -- Number of stored items
        local t = have_utable and utable.create(size, 0) or {}; -- Table to hold items
-
+       --luacheck: ignore 212/self
        return {
+               _items = t;
                size = size;
                count = function (self) return items; end;
                push = function (self, item)
                        if items >= size then
-                               return nil, "queue full";
+                               if allow_wrapping then
+                                       tail = (tail%size)+1; -- Advance to next oldest item
+                                       items = items - 1;
+                               else
+                                       return nil, "queue full";
+                               end
                        end
                        t[head] = item;
                        items = items + 1;
@@ -45,6 +51,19 @@ local function new(size)
                        end
                        return t[tail];
                end;
+               items = function (self)
+                       --luacheck: ignore 431/t
+                       return function (t, pos)
+                               if pos >= t:count() then
+                                       return nil;
+                               end
+                               local read_pos = tail + pos;
+                               if read_pos > t.size then
+                                       read_pos = (read_pos%size);
+                               end
+                               return pos+1, t._items[read_pos];
+                       end, self, 0;
+               end;
        };
 end