xref: /aosp_15_r20/external/llvm-libc/test/integration/src/threads/thrd_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Tests for thrd_t creation and joining -----------------------------===//
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/threads/thrd_create.h"
10 #include "src/threads/thrd_join.h"
11 
12 #include "test/IntegrationTest/test.h"
13 
14 #include <threads.h>
15 
16 static constexpr int thread_count = 1000;
17 static int counter = 0;
thread_func(void *)18 static int thread_func(void *) {
19   ++counter;
20   return 0;
21 }
22 
create_and_join()23 void create_and_join() {
24   for (counter = 0; counter <= thread_count;) {
25     thrd_t thread;
26     int old_counter_val = counter;
27     ASSERT_EQ(LIBC_NAMESPACE::thrd_create(&thread, thread_func, nullptr),
28               (int)thrd_success);
29     int retval = thread_count + 1; // Start with a retval we dont expect.
30     ASSERT_EQ(LIBC_NAMESPACE::thrd_join(thread, &retval), (int)thrd_success);
31     ASSERT_EQ(retval, 0);
32     ASSERT_EQ(counter, old_counter_val + 1);
33   }
34 }
35 
return_arg(void * arg)36 static int return_arg(void *arg) { return *reinterpret_cast<int *>(arg); }
37 
spawn_and_join()38 void spawn_and_join() {
39   thrd_t thread_list[thread_count];
40   int args[thread_count];
41 
42   for (int i = 0; i < thread_count; ++i) {
43     args[i] = i;
44     ASSERT_EQ(
45         LIBC_NAMESPACE::thrd_create(thread_list + i, return_arg, args + i),
46         (int)thrd_success);
47   }
48 
49   for (int i = 0; i < thread_count; ++i) {
50     int retval = thread_count + 1; // Start with a retval we dont expect.
51     ASSERT_EQ(LIBC_NAMESPACE::thrd_join(thread_list[i], &retval),
52               (int)thrd_success);
53     ASSERT_EQ(retval, i);
54   }
55 }
56 
TEST_MAIN()57 TEST_MAIN() {
58   create_and_join();
59   spawn_and_join();
60   return 0;
61 }
62