Unverified Commit 3d09b747 authored by Gregor Hartmann's avatar Gregor Hartmann Committed by GitHub
Browse files

Fifo fixes (#3638)

parent 0b879ce1
-- A generic fifo module. See docs/lua-modules/fifo.md for use examples. -- A generic fifo module. See docs/lua-modules/fifo.md for use examples.
local tr, ti = table.remove, table.insert local tableRemove, tableInsert = table.remove, table.insert
-- Remove an element and pass it to k, together with a boolean indicating that -- Remove an element and pass it to k, together with a boolean indicating that
-- this is the last element in the queue; if that returns a value, leave that -- this is the last element in the queue; if that returns a value, leave that
...@@ -17,29 +17,33 @@ local tr, ti = table.remove, table.insert ...@@ -17,29 +17,33 @@ local tr, ti = table.remove, table.insert
-- --
-- Returns 'true' if the queue contained at least one non-phantom entry, -- Returns 'true' if the queue contained at least one non-phantom entry,
-- 'false' otherwise. -- 'false' otherwise.
local function dequeue(q,k) local function dequeue(q, k)
if #q > 0 if #q > 0 then
then local new, again = k(q[1], #q == 1)
local new, again = k(q[1], #q == 1) if new == nil then
if new == nil tableRemove(q, 1)
then tr(q,1) else
if again then return dequeue(q, k) end -- note tail call q[1] = new
else q[1] = new end
end if again then
return true return dequeue(q, k)
else q._go = true ; return false end -- note tail call
return true
else
q._go = true
return false
end end
end end
-- Queue a on queue q and dequeue with `k` if the fifo had previously emptied. -- Queue a on queue q and dequeue with `k` if the fifo had previously emptied.
local function queue(q,a,k) local function queue(q,a,k)
ti(q,a) tableInsert(q,a)
if k ~= nil and q._go then q._go = false; dequeue(q, k) end if k ~= nil and q._go then q._go = false; dequeue(q, k) end
end end
-- return a table containing just the FIFO constructor -- return a table containing just the FIFO constructor
return { return {
['new'] = function() ['new'] = function()
return { ['_go'] = true ; ['queue'] = queue ; ['dequeue'] = dequeue } return { ['_go'] = true ; ['queue'] = queue ; ['dequeue'] = dequeue }
end end
} }
...@@ -58,7 +58,15 @@ local function wrap(sock) ...@@ -58,7 +58,15 @@ local function wrap(sock)
-- Either that was a function or we've hit our coalescing limit or -- Either that was a function or we've hit our coalescing limit or
-- we didn't ship above. Ship now, if there's something to ship. -- we didn't ship above. Ship now, if there's something to ship.
if s ~= nil then if s ~= nil then
if sslan == 0 then sock:send(s) else sock:send(ssla .. s) end if sslan == 0 then
if #s > 0 then
sock:send(s)
else
return ns or nil, true
end
else
sock:send(ssla .. s)
end
ssla, sslan = nil, 0; gc() ssla, sslan = nil, 0; gc()
return ns or nil, false return ns or nil, false
elseif sslan ~= 0 then elseif sslan ~= 0 then
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment