Initial commit

This commit is contained in:
Yervant7
2024-01-16 19:28:29 -03:00
commit 8c0524dc0f
9054 changed files with 1081727 additions and 0 deletions
@@ -0,0 +1,62 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// void swap(thread& x, thread& y);
#include <thread>
#include <new>
#include <cstdlib>
#include <cassert>
#include "make_test_thread.h"
#include "test_macros.h"
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
int main(int, char**)
{
{
G g;
std::thread t0 = support::make_test_thread(g);
std::thread::id id0 = t0.get_id();
std::thread t1;
std::thread::id id1 = t1.get_id();
swap(t0, t1);
assert(t0.get_id() == id1);
assert(t1.get_id() == id0);
t1.join();
}
return 0;
}
@@ -0,0 +1,23 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// <thread>
// class thread
// thread& operator=(thread&& t);
#include <thread>
int main(int, char**)
{
std::thread t0;
std::thread t1;
t0 = t1;
return 0;
}
@@ -0,0 +1,71 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// thread& operator=(thread&& t);
#include <thread>
#include <cassert>
#include <utility>
#include "make_test_thread.h"
#include "test_macros.h"
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
int main(int, char**)
{
assert(G::n_alive == 0);
assert(!G::op_run);
{
G g;
assert(G::n_alive == 1);
assert(!G::op_run);
std::thread t0 = support::make_test_thread(g);
std::thread::id id = t0.get_id();
std::thread t1;
t1 = std::move(t0);
assert(t1.get_id() == id);
assert(t0.get_id() == std::thread::id());
t1.join();
assert(G::n_alive == 1);
assert(G::op_run);
}
assert(G::n_alive == 0);
assert(G::op_run);
return 0;
}
@@ -0,0 +1,48 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// thread& operator=(thread&& t);
#include <thread>
#include <cassert>
#include <cstdlib>
#include <exception>
#include <utility>
#include "make_test_thread.h"
#include "test_macros.h"
struct G
{
void operator()() { }
};
void f1()
{
std::_Exit(0);
}
int main(int, char**)
{
std::set_terminate(f1);
{
G g;
std::thread t0 = support::make_test_thread(g);
std::thread t1;
t0 = std::move(t1);
assert(false);
}
return 0;
}
@@ -0,0 +1,216 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// <thread>
// class thread
// template <class F, class ...Args> thread(F&& f, Args&&... args);
// UNSUPPORTED: no-threads
// UNSUPPORTED: sanitizer-new-delete
#include <thread>
#include <new>
#include <atomic>
#include <cstdlib>
#include <cassert>
#include <vector>
#include "test_macros.h"
std::atomic<unsigned> throw_one(0xFFFF);
std::atomic<unsigned> outstanding_new(0);
void* operator new(std::size_t s) TEST_THROW_SPEC(std::bad_alloc)
{
unsigned expected = throw_one;
do {
if (expected == 0) TEST_THROW(std::bad_alloc());
} while (!throw_one.compare_exchange_weak(expected, expected - 1));
++outstanding_new;
void* ret = std::malloc(s);
if (!ret) std::abort(); // placate MSVC's unchecked malloc warning
return ret;
}
void operator delete(void* p) TEST_NOEXCEPT
{
if (!p) return;
--outstanding_new;
std::free(p);
}
bool f_run = false;
struct F {
std::vector<int> v_; // so f's copy-ctor calls operator new
explicit F() : v_(10) {}
void operator()() const { f_run = true; }
};
F f;
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
void operator()(int i, double j)
{
assert(alive_ == 1);
assert(n_alive >= 1);
assert(i == 5);
assert(j == 5.5);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
#if TEST_STD_VER >= 11
class MoveOnly
{
MoveOnly(const MoveOnly&);
public:
MoveOnly() {}
MoveOnly(MoveOnly&&) {}
void operator()(MoveOnly&&)
{
}
};
#endif
// Test throwing std::bad_alloc
//-----------------------------
// Concerns:
// A Each allocation performed during thread construction should be performed
// in the parent thread so that std::terminate is not called if
// std::bad_alloc is thrown by new.
// B std::thread's constructor should properly handle exceptions and not leak
// memory.
// Plan:
// 1 Create a thread and count the number of allocations, 'numAllocs', it
// performs.
// 2 For each allocation performed run a test where that allocation throws.
// 2.1 check that the exception can be caught in the parent thread.
// 2.2 Check that the functor has not been called.
// 2.3 Check that no memory allocated by the creation of the thread is leaked.
// 3 Finally check that a thread runs successfully if we throw after
// 'numAllocs + 1' allocations.
int numAllocs;
void test_throwing_new_during_thread_creation() {
#ifndef TEST_HAS_NO_EXCEPTIONS
throw_one = 0xFFF;
{
std::thread t(f);
t.join();
}
numAllocs = 0xFFF - throw_one;
// i <= numAllocs means the last iteration is expected not to throw.
for (int i=0; i <= numAllocs; ++i) {
throw_one = i;
f_run = false;
unsigned old_outstanding = outstanding_new;
try {
std::thread t(f);
assert(i == numAllocs); // Only final iteration will not throw.
t.join();
assert(f_run);
} catch (std::bad_alloc const&) {
assert(i < numAllocs);
assert(!f_run); // (2.2)
}
ASSERT_WITH_LIBRARY_INTERNAL_ALLOCATIONS(old_outstanding == outstanding_new); // (2.3)
}
f_run = false;
throw_one = 0xFFF;
#endif
}
int main(int, char**)
{
test_throwing_new_during_thread_creation();
{
std::thread t(f);
t.join();
assert(f_run == true);
}
{
assert(G::n_alive == 0);
assert(!G::op_run);
{
G g;
std::thread t(g);
t.join();
}
assert(G::n_alive == 0);
assert(G::op_run);
}
G::op_run = false;
#ifndef TEST_HAS_NO_EXCEPTIONS
// The test below expects `std::thread` to call `new`, which may not be the
// case for all implementations.
LIBCPP_ASSERT(numAllocs > 0); // libc++ should call new.
if (numAllocs > 0) {
try
{
throw_one = 0;
assert(G::n_alive == 0);
assert(!G::op_run);
std::thread t((G()));
assert(false);
}
catch (std::bad_alloc const&)
{
throw_one = 0xFFFF;
assert(G::n_alive == 0);
assert(!G::op_run);
}
}
#endif
#if TEST_STD_VER >= 11
{
assert(G::n_alive == 0);
assert(!G::op_run);
{
G g;
std::thread t(g, 5, 5.5);
t.join();
}
assert(G::n_alive == 0);
assert(G::op_run);
}
{
std::thread t = std::thread(MoveOnly(), MoveOnly());
t.join();
}
#endif
return 0;
}
@@ -0,0 +1,25 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// <thread>
// class thread
// template <class _Fp, class ..._Args,
// explicit thread(_Fp&& __f, _Args&&... __args);
// This constructor shall not participate in overload resolution
// if decay<F>::type is the same type as std::thread.
#include <thread>
int main(int, char**)
{
volatile std::thread t1;
std::thread t2 ( t1, 1, 2.0 );
return 0;
}
@@ -0,0 +1,22 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// <thread>
// class thread
// thread(const thread&) = delete;
#include <thread>
int main(int, char**)
{
std::thread t0; (void)t0;
std::thread t1(t0); (void)t1;
return 0;
}
@@ -0,0 +1,28 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// thread();
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread t;
assert(t.get_id() == std::thread::id());
return 0;
}
@@ -0,0 +1,71 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// thread(thread&& t);
#include <thread>
#include <cassert>
#include <cstdlib>
#include <utility>
#include "make_test_thread.h"
#include "test_macros.h"
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
int main(int, char**)
{
assert(G::n_alive == 0);
assert(!G::op_run);
{
G g;
assert(G::n_alive == 1);
assert(!G::op_run);
std::thread t0 = support::make_test_thread(g);
std::thread::id id = t0.get_id();
std::thread t1 = std::move(t0);
assert(t1.get_id() == id);
assert(t0.get_id() == std::thread::id());
t1.join();
assert(G::n_alive == 1);
assert(G::op_run);
}
assert(G::n_alive == 0);
assert(G::op_run);
return 0;
}
@@ -0,0 +1,33 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: no-threads
// UNSUPPORTED: c++03
// <thread>
// class thread
// template <class F, class ...Args> thread(F&& f, Args&&... args);
#include <thread>
#include "test_macros.h"
struct Incomplete;
template<class T> struct Holder { T t; };
void f(Holder<Incomplete> *) { }
int main(int, char **)
{
Holder<Incomplete> *p = nullptr;
std::thread t(f, p);
t.join();
return 0;
}
@@ -0,0 +1,68 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// ~thread();
#include <thread>
#include <new>
#include <cstdlib>
#include <cassert>
#include "make_test_thread.h"
#include "test_macros.h"
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
void f1()
{
std::_Exit(0);
}
int main(int, char**)
{
std::set_terminate(f1);
{
assert(G::n_alive == 0);
assert(!G::op_run);
G g;
{
std::thread t = support::make_test_thread(g);
std::this_thread::sleep_for(std::chrono::milliseconds(250));
}
}
assert(false);
return 0;
}
@@ -0,0 +1,32 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread::id
// id& operator=(const id&) = default;
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread::id id0;
std::thread::id id1;
id1 = id0;
assert(id1 == id0);
id1 = std::this_thread::get_id();
assert(id1 != id0);
return 0;
}
@@ -0,0 +1,29 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread::id
// id(const id&) = default;
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread::id id0;
std::thread::id id1 = id0;
assert(id1 == id0);
return 0;
}
@@ -0,0 +1,28 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread::id
// id();
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread::id id;
assert(id == std::thread::id());
return 0;
}
@@ -0,0 +1,30 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: no-threads
// UNSUPPORTED: c++03
// <thread>
// Test that <thread> provides all of the arithmetic, enum, and pointer
// hash specializations.
#include <thread>
#include "poisoned_hash_helper.h"
#include "test_macros.h"
int main(int, char**) {
test_library_hash_specializations_available();
{
test_hash_enabled_for_type<std::thread::id>();
}
return 0;
}
@@ -0,0 +1,35 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread::id
// bool operator==(thread::id x, thread::id y);
// bool operator!=(thread::id x, thread::id y);
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread::id id0;
std::thread::id id1;
id1 = id0;
assert( (id1 == id0));
assert(!(id1 != id0));
id1 = std::this_thread::get_id();
assert(!(id1 == id0));
assert( (id1 != id0));
return 0;
}
@@ -0,0 +1,46 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread::id
// bool operator< (thread::id x, thread::id y);
// bool operator<=(thread::id x, thread::id y);
// bool operator> (thread::id x, thread::id y);
// bool operator>=(thread::id x, thread::id y);
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread::id id0;
std::thread::id id1;
std::thread::id id2 = std::this_thread::get_id();
assert(!(id0 < id1));
assert( (id0 <= id1));
assert(!(id0 > id1));
assert( (id0 >= id1));
assert(!(id0 == id2));
if (id0 < id2) {
assert( (id0 <= id2));
assert(!(id0 > id2));
assert(!(id0 >= id2));
} else {
assert(!(id0 <= id2));
assert( (id0 > id2));
assert( (id0 >= id2));
}
return 0;
}
@@ -0,0 +1,33 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: no-threads
// UNSUPPORTED: no-localization
// <thread>
// class thread::id
// template<class charT, class traits>
// basic_ostream<charT, traits>&
// operator<<(basic_ostream<charT, traits>& out, thread::id id);
#include <thread>
#include <sstream>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread::id id0 = std::this_thread::get_id();
std::ostringstream os;
os << id0;
return 0;
}
@@ -0,0 +1,40 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// template <class T>
// struct hash
// {
// size_t operator()(T val) const;
// };
// Not very portable
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::thread::id id1;
std::thread::id id2 = std::this_thread::get_id();
typedef std::hash<std::thread::id> H;
#if TEST_STD_VER <= 14
static_assert((std::is_same<typename H::argument_type, std::thread::id>::value), "" );
static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" );
#endif
ASSERT_NOEXCEPT(H()(id2));
H h;
assert(h(id1) != h(id2));
return 0;
}
@@ -0,0 +1,98 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// void detach();
#include <thread>
#include <atomic>
#include <system_error>
#include <cassert>
#include "make_test_thread.h"
#include "test_macros.h"
std::atomic_bool done(false);
class G
{
int alive_;
bool done_;
public:
static int n_alive;
static bool op_run;
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;
}
};
int G::n_alive = 0;
bool G::op_run = false;
void foo() { done = true; }
int main(int, char**)
{
{
G g;
std::thread t0 = support::make_test_thread(g);
assert(t0.joinable());
t0.detach();
assert(!t0.joinable());
while (!done) {}
assert(G::op_run);
assert(G::n_alive == 1);
}
assert(G::n_alive == 0);
done = false;
#ifndef TEST_HAS_NO_EXCEPTIONS
{
std::thread t0 = support::make_test_thread(foo);
assert(t0.joinable());
t0.detach();
assert(!t0.joinable());
try {
t0.detach();
} catch (std::system_error const&) {
}
// Wait to make sure that the detached thread has started up.
// Without this, we could exit main and start destructing global
// resources that are needed when the thread starts up, while the
// detached thread would start up only later.
while (!done) {}
}
#endif
return 0;
}
@@ -0,0 +1,62 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// id get_id() const;
#include <thread>
#include <new>
#include <cstdlib>
#include <cassert>
#include "make_test_thread.h"
#include "test_macros.h"
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
int main(int, char**)
{
{
G g;
std::thread t0 = support::make_test_thread(g);
std::thread::id id0 = t0.get_id();
std::thread t1;
std::thread::id id1 = t1.get_id();
assert(t0.get_id() == id0);
assert(id0 != id1);
assert(t1.get_id() == std::thread::id());
t0.join();
}
return 0;
}
@@ -0,0 +1,87 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// void join();
#include <thread>
#include <new>
#include <cstdlib>
#include <cassert>
#include <system_error>
#include <atomic>
#include "make_test_thread.h"
#include "test_macros.h"
std::atomic_bool done(false);
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
void foo() { done = true; }
int main(int, char**)
{
{
G g;
std::thread t0 = support::make_test_thread(g);
assert(t0.joinable());
t0.join();
assert(!t0.joinable());
#ifndef TEST_HAS_NO_EXCEPTIONS
try {
t0.join();
assert(false);
} catch (std::system_error const&) {
}
#endif
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
std::thread t0 = support::make_test_thread(foo);
t0.detach();
try {
t0.join();
assert(false);
} catch (std::system_error const&) {
}
// Wait to make sure that the detached thread has started up.
// Without this, we could exit main and start destructing global
// resources that are needed when the thread starts up, while the
// detached thread would start up only later.
while (!done) {}
}
#endif
return 0;
}
@@ -0,0 +1,58 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// bool joinable() const;
#include <thread>
#include <new>
#include <cstdlib>
#include <cassert>
#include "make_test_thread.h"
#include "test_macros.h"
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
int main(int, char**)
{
{
G g;
std::thread t0 = support::make_test_thread(g);
assert(t0.joinable());
t0.join();
assert(!t0.joinable());
}
return 0;
}
@@ -0,0 +1,62 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// void swap(thread& t);
#include <thread>
#include <new>
#include <cstdlib>
#include <cassert>
#include "make_test_thread.h"
#include "test_macros.h"
class G
{
int alive_;
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;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
};
int G::n_alive = 0;
bool G::op_run = false;
int main(int, char**)
{
{
G g;
std::thread t0 = support::make_test_thread(g);
std::thread::id id0 = t0.get_id();
std::thread t1;
std::thread::id id1 = t1.get_id();
t0.swap(t1);
assert(t0.get_id() == id1);
assert(t1.get_id() == id0);
t1.join();
}
return 0;
}
@@ -0,0 +1,27 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: no-threads
// <thread>
// class thread
// unsigned hardware_concurrency();
#include <thread>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
assert(std::thread::hardware_concurrency() > 0);
return 0;
}