Skip to content
Snippets Groups Projects
Commit c1cf1e0b authored by Martin Karlgren's avatar Martin Karlgren
Browse files

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.
parent f506de44
No related branches found
No related tags found
No related merge requests found
...@@ -1059,6 +1059,9 @@ variant inline Future race(Future ... futures) ...@@ -1059,6 +1059,9 @@ variant inline Future race(Future ... futures)
//! @[all()], @[Promise.depend()] //! @[all()], @[Promise.depend()]
variant Future results(array(Future) futures) variant Future results(array(Future) futures)
{ {
if(!sizeof(futures))
return resolve(({}));
return Promise()->depend(futures)->future(); return Promise()->depend(futures)->future();
} }
inline variant Future results(Future ... futures) inline variant Future results(Future ... futures)
......
...@@ -379,6 +379,12 @@ test_do([[ add_constant("p12"); ]]) ...@@ -379,6 +379,12 @@ test_do([[ add_constant("p12"); ]])
test_do([[ add_constant("p13"); ]]) test_do([[ add_constant("p13"); ]])
exit_promise(1, ({11, 14, 12, 13})) 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() dnl - Concurrent.traverse()
init_promise() init_promise()
test_do([[ add_constant("p11", Concurrent.Promise()); ]]) test_do([[ add_constant("p11", Concurrent.Promise()); ]])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment