summaryrefslogtreecommitdiff
path: root/indra/newview/scripts/lua/ErrorQueue.lua
blob: a6d4470044379747ce715cbf2ae33c933f701a1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- ErrorQueue isa WaitQueue with the added feature that a producer can push an
-- error through the queue. Once that error is dequeued, every consumer will
-- raise that error.

local WaitQueue = require('WaitQueue')

local ErrorQueue = WaitQueue:new()

function ErrorQueue:Error(message)
    -- Setting Error() is a marker, like closing the queue. Once we reach the
    -- error, every subsequent Dequeue() call will raise the same error.
    self._closed = message
    self:_wake_waiters()
end

function ErrorQueue:Dequeue()
    local value = WaitQueue.Dequeue(self)
    if value ~= nil then
        -- queue not yet closed, show caller
        return value
    end
    if self._closed == true then
        -- WaitQueue:close() sets true: queue has only been closed, tell caller
        return nil
    end
    -- self._closed is a message set by Error()
    error(self._closed)
end

return ErrorQueue