diff options
author | Matthew Wild <mwild1@gmail.com> | 2018-03-17 17:28:07 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2018-03-17 17:28:07 +0000 |
commit | 2fbef935f9e7f7500376969c92655ae7a0897fe2 (patch) | |
tree | ba0e2d77d6915d76cae53d08f22749679b773f2c | |
parent | 9d1d5d021bd72d872b8b4c5abd3cf3548933f930 (diff) | |
download | prosody-2fbef935f9e7f7500376969c92655ae7a0897fe2.tar.gz prosody-2fbef935f9e7f7500376969c92655ae7a0897fe2.zip |
util.async: ensure change in e77b37de482e applies after out-of-loop resume also
-rw-r--r-- | spec/util_async_spec.lua | 25 | ||||
-rw-r--r-- | util/async.lua | 3 |
2 files changed, 26 insertions, 2 deletions
diff --git a/spec/util_async_spec.lua b/spec/util_async_spec.lua index 24f4d8c8..f7d11be0 100644 --- a/spec/util_async_spec.lua +++ b/spec/util_async_spec.lua @@ -180,6 +180,31 @@ describe("util.async", function() assert.spy(runner.watchers.error).was.called(1); assert.equal(last_item, "two"); end); + + it("should continue to process work items during resume", function () + local wait, done, last_item; + local runner_func = spy.new(function (item) + if item == "error" then + error("test error"); + elseif item == "wait-error" then + wait, done = async.waiter(); + wait(); + error("test error"); + end + last_item = item; + end); + local runner = async.runner(runner_func, { error = spy.new(function () end) }); + runner:enqueue("one"); + runner:enqueue("wait-error"); + runner:enqueue("two"); + runner:run(); + done(); + assert.equal(r.state, "ready"); + assert.equal(r.state, r.notified_state); + assert.spy(runner_func).was.called(3); + assert.spy(runner.watchers.error).was.called(1); + assert.equal(last_item, "two"); + end); end); end); describe("#waiter", function() diff --git a/util/async.lua b/util/async.lua index 8756c81a..9189e6d1 100644 --- a/util/async.lua +++ b/util/async.lua @@ -32,8 +32,7 @@ local function runner_continue(thread) if error_handler then error_handler(runner, debug.traceback(thread, err)); end local ready_handler = runner.watchers.ready; runner.state, runner.thread = "ready", nil; - if ready_handler then ready_handler(runner); end - runner.notified_state = "ready"; + return runner:run(); elseif state == "ready" then -- 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 |