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 | #ifndef TEST_SUPPORT_MAKE_TEST_THREAD_H |
10 | #define TEST_SUPPORT_MAKE_TEST_THREAD_H |
11 | |
12 | #include <thread> |
13 | #include <utility> |
14 | |
15 | #include "test_macros.h" |
16 | |
17 | namespace support { |
18 | |
19 | // These functions are used to mock the creation of threads within the test suite. |
20 | // |
21 | // This provides a vendor-friendly way of making the test suite work even on platforms |
22 | // where the standard thread constructors don't work (e.g. embedded environments where |
23 | // creating a thread requires additional information like setting attributes). |
24 | // |
25 | // Vendors can keep a downstream diff in this file to create threads however they |
26 | // need on their platform, and the majority of the test suite will work out of the |
27 | // box. Of course, tests that exercise the standard thread constructors won't work, |
28 | // but any other test that only creates threads as a side effect of testing should |
29 | // work if they use the utilities in this file. |
30 | |
31 | template <class F, class ...Args> |
32 | std::thread make_test_thread(F&& f, Args&& ...args) { |
33 | return std::thread(std::forward<F>(f), std::forward<Args>(args)...); |
34 | } |
35 | |
36 | #if TEST_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_STOP_TOKEN) |
37 | # ifdef _LIBCPP_VERSION |
38 | # define TEST_AVAILABILITY_SYNC _LIBCPP_AVAILABILITY_SYNC |
39 | # else |
40 | # define TEST_AVAILABILITY_SYNC |
41 | # endif |
42 | |
43 | template <class F, class... Args> |
44 | TEST_AVAILABILITY_SYNC std::jthread make_test_jthread(F&& f, Args&&... args) { |
45 | return std::jthread(std::forward<F>(f), std::forward<Args>(args)...); |
46 | } |
47 | #endif |
48 | |
49 | } // end namespace support |
50 | |
51 | #endif // TEST_SUPPORT_MAKE_TEST_THREAD_H |
52 | |