summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/thread/thread.threads
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2015-05-19 23:41:04 +0000
committerEric Fiselier <eric@efcs.ca>2015-05-19 23:41:04 +0000
commit513ae1854dea8795aea691f6c6165a072904a981 (patch)
treed7c5c4faf5d94ae102b21cca51203ad1c3956245 /libcxx/test/std/thread/thread.threads
parentd97cdf28e63fc43bf181c560f8d66d09405b364d (diff)
downloadbcm5719-llvm-513ae1854dea8795aea691f6c6165a072904a981.tar.gz
bcm5719-llvm-513ae1854dea8795aea691f6c6165a072904a981.zip
Fix race condition in thread test.
llvm-svn: 237745
Diffstat (limited to 'libcxx/test/std/thread/thread.threads')
-rw-r--r--libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp
index 5a312324400..f4a4d1f777f 100644
--- a/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp
+++ b/libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp
@@ -16,26 +16,41 @@
// void detach();
#include <thread>
-#include <new>
-#include <cstdlib>
+#include <atomic>
#include <cassert>
+std::atomic_bool done = ATOMIC_VAR_INIT(false);
+
class G
{
int alive_;
+ bool done_;
public:
static int n_alive;
static bool op_run;
- G() : alive_(1) {++n_alive;}
- G(const G& g) : alive_(g.alive_) {++n_alive;}
- ~G() {alive_ = 0; --n_alive;}
+ G() : alive_(1), done_(false)
+ {
+ ++n_alive;
+ }
+
+ G(const G& g) : alive_(g.alive_), done_(false)
+ {
+ ++n_alive;
+ }
+ ~G()
+ {
+ alive_ = 0;
+ --n_alive;
+ if (done_) done = true;
+ }
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
+ done_ = true;
}
};
@@ -45,12 +60,14 @@ bool G::op_run = false;
int main()
{
{
- std::thread t0((G()));
+ G g;
+ std::thread t0(g);
assert(t0.joinable());
t0.detach();
assert(!t0.joinable());
- std::this_thread::sleep_for(std::chrono::milliseconds(250));
+ while (!done) {}
assert(G::op_run);
- assert(G::n_alive == 0);
+ assert(G::n_alive == 1);
}
+ assert(G::n_alive == 0);
}
OpenPOWER on IntegriCloud