aboutsummaryrefslogtreecommitdiffstats
path: root/util/queue.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2015-05-13 17:00:27 +0100
committerMatthew Wild <mwild1@gmail.com>2015-05-13 17:00:27 +0100
commit70e77200f7789e9fb606c7e99e30a54aca70c5c5 (patch)
tree65bc2e4d57655c0f62aec527649de4e5f46296d4 /util/queue.lua
parent125dc63f565a46aedcb1750c45dcc97c71c2c72b (diff)
parent9bd85eabf029220d25431ab17bc86bf308b51b8d (diff)
downloadprosody-70e77200f7789e9fb606c7e99e30a54aca70c5c5.tar.gz
prosody-70e77200f7789e9fb606c7e99e30a54aca70c5c5.zip
Merge 0.10->trunk
Diffstat (limited to 'util/queue.lua')
-rw-r--r--util/queue.lua54
1 files changed, 54 insertions, 0 deletions
diff --git a/util/queue.lua b/util/queue.lua
new file mode 100644
index 00000000..afdcaf45
--- /dev/null
+++ b/util/queue.lua
@@ -0,0 +1,54 @@
+-- Prosody IM
+-- Copyright (C) 2008-2015 Matthew Wild
+-- Copyright (C) 2008-2015 Waqas Hussain
+--
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
+-- Small ringbuffer library (i.e. an efficient FIFO queue with a size limit)
+-- (because unbounded dynamically-growing queues are a bad thing...)
+
+local have_utable, utable = pcall(require, "util.table"); -- For pre-allocation of table
+
+local function new(size)
+ -- 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
+
+ return {
+ size = size;
+ count = function (self) return items; end;
+ push = function (self, item)
+ if items >= size then
+ return nil, "queue full";
+ end
+ t[head] = item;
+ items = items + 1;
+ head = (head%size)+1;
+ return true;
+ end;
+ pop = function (self)
+ if items == 0 then
+ return nil;
+ end
+ local item;
+ item, t[tail] = t[tail], 0;
+ tail = (tail%size)+1;
+ items = items - 1;
+ return item;
+ end;
+ peek = function (self)
+ if items == 0 then
+ return nil;
+ end
+ return t[tail];
+ end;
+ };
+end
+
+return {
+ new = new;
+};
+