1 | //===-- Tests for thread detach functionality -----------------------------===// |
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 | #include "src/__support/threads/mutex.h" |
10 | #include "src/__support/threads/thread.h" |
11 | #include "test/IntegrationTest/test.h" |
12 | |
13 | LIBC_NAMESPACE::Mutex mutex(/*timed=*/false, /*recursive=*/false, |
14 | /*robust=*/false, /*pshared=*/false); |
15 | |
16 | int func(void *) { |
17 | mutex.lock(); |
18 | mutex.unlock(); |
19 | return 0; |
20 | } |
21 | |
22 | void detach_simple_test() { |
23 | mutex.lock(); |
24 | LIBC_NAMESPACE::Thread th; |
25 | th.run(func, nullptr, nullptr, 0); |
26 | |
27 | // Since |mutex| is held by the current thread, we guarantee that |
28 | // th is running and hence it is safe to detach. Since the thread is |
29 | // still running, it should be simple detach. |
30 | ASSERT_EQ(th.detach(), int(LIBC_NAMESPACE::DetachType::SIMPLE)); |
31 | |
32 | // We will release |mutex| now to let the thread finish an cleanup itself. |
33 | mutex.unlock(); |
34 | } |
35 | |
36 | void detach_cleanup_test() { |
37 | mutex.lock(); |
38 | LIBC_NAMESPACE::Thread th; |
39 | ASSERT_EQ(0, th.run(func, nullptr)); |
40 | |
41 | // Since |mutex| is held by the current thread, we will release it |
42 | // to let |th| run. |
43 | mutex.unlock(); |
44 | |
45 | // We will wait for |th| to finish. Since it is a joinable thread, |
46 | // we can wait on it safely. |
47 | th.wait(); |
48 | |
49 | // Since |th| is now finished, detaching should cleanup the thread |
50 | // resources. |
51 | ASSERT_EQ(th.detach(), int(LIBC_NAMESPACE::DetachType::CLEANUP)); |
52 | } |
53 | |
54 | TEST_MAIN() { |
55 | detach_simple_test(); |
56 | detach_cleanup_test(); |
57 | return 0; |
58 | } |
59 | |