Software /
code /
prosody
Diff
util/async.lua @ 11962:9a70a543c727
util.async: Add next-tick configuration
Running woken runners in the next iteration of the event loop prevents
unexpected recursion, unexpected tracebacks, and is generally more
predictable.
The pattern is borrowed from util.promise, where we're now doing the same.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 29 Nov 2021 14:14:30 +0000 |
parent | 11961:542a9a503073 |
child | 12310:91af1697ddd8 |
line wrap: on
line diff
--- a/util/async.lua Mon Nov 29 14:11:24 2021 +0000 +++ b/util/async.lua Mon Nov 29 14:14:30 2021 +0000 @@ -13,6 +13,9 @@ -- Configurable functions local schedule_task = nil; -- schedule_task(seconds, callback) +local next_tick = function (f) + f(); +end local function runner_from_thread(thread) local level = 0; @@ -62,8 +65,10 @@ -- If state is 'ready', it is our responsibility to update runner.state from 'waiting'. -- We also have to :run(), because the queue might have further items that will not be -- processed otherwise. FIXME: It's probably best to do this in a nexttick (0 timer). - runner.state = "ready"; - runner:run(); + next_tick(function () + runner.state = "ready"; + runner:run(); + end); end return true; end @@ -286,5 +291,6 @@ wait_for = wait_for; sleep = sleep; + set_nexttick = function(new_next_tick) next_tick = new_next_tick; end; set_schedule_function = function (new_schedule_function) schedule_task = new_schedule_function; end; };