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