aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2018-03-17 17:28:07 +0000
committerMatthew Wild <mwild1@gmail.com>2018-03-17 17:28:07 +0000
commit2fbef935f9e7f7500376969c92655ae7a0897fe2 (patch)
treeba0e2d77d6915d76cae53d08f22749679b773f2c
parent9d1d5d021bd72d872b8b4c5abd3cf3548933f930 (diff)
downloadprosody-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.lua25
-rw-r--r--util/async.lua3
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