mirror of
https://github.com/1bardesign/batteries.git
synced 2024-11-25 23:24:35 +00:00
Merge pull request #54 from idbrii/capture-w-func
async: Use function to capture ...
This commit is contained in:
commit
840f4ba703
59
async.lua
59
async.lua
@ -49,6 +49,35 @@ function async:add(co, args, callback, error_callback)
|
||||
})
|
||||
end
|
||||
|
||||
local function process_resume(self, td, success, msg, ...)
|
||||
local co, args, cb, error_cb = unpack(td)
|
||||
--error?
|
||||
if not success then
|
||||
if error_cb then
|
||||
error_cb(msg)
|
||||
else
|
||||
local err = ("failure in async task:\n\n\t%s\n")
|
||||
:format(tostring(msg))
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
--check done
|
||||
if coroutine.status(co) == "dead" then
|
||||
--done? run callback with result
|
||||
if cb then
|
||||
cb(msg, ...)
|
||||
end
|
||||
else
|
||||
--if not completed, re-add to the appropriate queue
|
||||
if msg == "stall" then
|
||||
--add to stalled queue as signalled stall
|
||||
table.insert(self.tasks_stalled, td)
|
||||
else
|
||||
table.insert(self.tasks, td)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--update some task in the kernel
|
||||
function async:update()
|
||||
--grab task definition
|
||||
@ -65,34 +94,8 @@ function async:update()
|
||||
end
|
||||
--run a step
|
||||
--(using unpack because coroutine is also nyi and it's core to this async model)
|
||||
local co, args, cb, error_cb = unpack(td)
|
||||
--(8 temps rather than table churn capturing varargs)
|
||||
local success, a, b, c, d, e, f, g, h = coroutine.resume(co, unpack(args))
|
||||
--error?
|
||||
if not success then
|
||||
if error_cb then
|
||||
error_cb(a)
|
||||
else
|
||||
local err = ("failure in async task:\n\n\t%s\n")
|
||||
:format(tostring(a))
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
--check done
|
||||
if coroutine.status(co) == "dead" then
|
||||
--done? run callback with result
|
||||
if cb then
|
||||
cb(a, b, c, d, e, f, g, h)
|
||||
end
|
||||
else
|
||||
--if not completed, re-add to the appropriate queue
|
||||
if a == "stall" then
|
||||
--add to stalled queue as signalled stall
|
||||
table.insert(self.tasks_stalled, td)
|
||||
else
|
||||
table.insert(self.tasks, td)
|
||||
end
|
||||
end
|
||||
local co, args = unpack(td)
|
||||
process_resume(self, td, coroutine.resume(co, unpack(args)))
|
||||
|
||||
return true
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user