From c1cf1e0bdf7106f5d5ebf008a74836eb0c6e59b5 Mon Sep 17 00:00:00 2001 From: Martin Karlgren <marty@roxen.com> Date: Mon, 9 Apr 2018 23:51:32 +0200 Subject: [PATCH] Concurrent.results: Handle an empty argument array properly. Previously code such as: Concurrent.Future f2 = Concurrent.results(({})); f2->on_success(lambda(array(string) a) { werror("success: %O.\n", a); }) ->on_failure(lambda(mixed err) { werror (describe_backtrace(err)); }); ... would lead to a backtrace because the future was destructed prematurely. --- lib/modules/Concurrent.pmod | 3 +++ lib/modules/testsuite.in | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/lib/modules/Concurrent.pmod b/lib/modules/Concurrent.pmod index 0a67b52e37..b924e614ba 100644 --- a/lib/modules/Concurrent.pmod +++ b/lib/modules/Concurrent.pmod @@ -1059,6 +1059,9 @@ variant inline Future race(Future ... futures) //! @[all()], @[Promise.depend()] variant Future results(array(Future) futures) { + if(!sizeof(futures)) + return resolve(({})); + return Promise()->depend(futures)->future(); } inline variant Future results(Future ... futures) diff --git a/lib/modules/testsuite.in b/lib/modules/testsuite.in index 9c1566bcde..891cafbcc9 100644 --- a/lib/modules/testsuite.in +++ b/lib/modules/testsuite.in @@ -379,6 +379,12 @@ test_do([[ add_constant("p12"); ]]) test_do([[ add_constant("p13"); ]]) exit_promise(1, ({11, 14, 12, 13})) +dnl - Concurrent.results() - empty +init_promise() +test_do([[ add_constant("future", Concurrent.results(({}))); ]]) +init_future() +exit_promise(1, ({})) + dnl - Concurrent.traverse() init_promise() test_do([[ add_constant("p11", Concurrent.Promise()); ]]) -- GitLab