Skip to content

Commit d1944d4

Browse files
committed
[libc++] Don't try to wait on a thread that hasn't started in std::async
1 parent 6dd07b1 commit d1944d4

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

libcxx/include/future

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,8 @@ void __async_assoc_state<_Rp, _Fp>::__execute() {
865865

866866
template <class _Rp, class _Fp>
867867
void __async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT {
868-
this->wait();
868+
if (base::__state_ & base::__constructed)
869+
this->wait();
869870
base::__on_zero_shared();
870871
}
871872

@@ -902,7 +903,8 @@ void __async_assoc_state<void, _Fp>::__execute() {
902903

903904
template <class _Fp>
904905
void __async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT {
905-
this->wait();
906+
if (base::__state_ & base::__constructed)
907+
this->wait();
906908
base::__on_zero_shared();
907909
}
908910

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// UNSUPPORTED: no-threads, no-exceptions
10+
11+
// UNSUPPORTED: c++03
12+
13+
// There is no way to limit the number of threads on windows
14+
// UNSUPPORTED: msvc
15+
16+
// AIX doesn't seem to complain if the thread limit is reached.
17+
// XFAIL: target={{.+}}-aix{{.*}}
18+
19+
#include <cassert>
20+
#include <future>
21+
#include <system_error>
22+
23+
#if __has_include(<sys/resource.h>)
24+
# include <sys/resource.h>
25+
# ifdef RLIMIT_NPROC
26+
void force_thread_creation_failure() {
27+
rlimit lim = {1, 1};
28+
setrlimit(RLIMIT_NPROC, &lim);
29+
}
30+
# else
31+
# error "No known way to force only one thread being available"
32+
# endif
33+
#else
34+
# error "No known way to force only one thread being available"
35+
#endif
36+
37+
int main() {
38+
force_thread_creation_failure();
39+
40+
try {
41+
auto fut = std::async(std::launch::async, [] { return 1; });
42+
assert(false);
43+
} catch (const std::system_error&) {
44+
}
45+
46+
try {
47+
auto fut = std::async(std::launch::async, [] { return; });
48+
assert(false);
49+
} catch (const std::system_error&) {
50+
}
51+
}

0 commit comments

Comments
 (0)