xref: /llvm-project/libc/test/integration/src/threads/thrd_test.cpp (revision b6bc9d72f65a5086f310f321e969d96e9a559e75)
1d5475af2SSiva Chandra Reddy //===-- Tests for thrd_t creation and joining -----------------------------===//
2d5475af2SSiva Chandra Reddy //
3d5475af2SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d5475af2SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5d5475af2SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d5475af2SSiva Chandra Reddy //
7d5475af2SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8d5475af2SSiva Chandra Reddy 
9d5475af2SSiva Chandra Reddy #include "src/threads/thrd_create.h"
10d5475af2SSiva Chandra Reddy #include "src/threads/thrd_join.h"
11d5475af2SSiva Chandra Reddy 
12af1315c2SSiva Chandra Reddy #include "test/IntegrationTest/test.h"
13d5475af2SSiva Chandra Reddy 
14d5475af2SSiva Chandra Reddy #include <threads.h>
15d5475af2SSiva Chandra Reddy 
16d5475af2SSiva Chandra Reddy static constexpr int thread_count = 1000;
17d5475af2SSiva Chandra Reddy static int counter = 0;
thread_func(void *)18d5475af2SSiva Chandra Reddy static int thread_func(void *) {
19d5475af2SSiva Chandra Reddy   ++counter;
20d5475af2SSiva Chandra Reddy   return 0;
21d5475af2SSiva Chandra Reddy }
22d5475af2SSiva Chandra Reddy 
create_and_join()23d5475af2SSiva Chandra Reddy void create_and_join() {
24d5475af2SSiva Chandra Reddy   for (counter = 0; counter <= thread_count;) {
25d5475af2SSiva Chandra Reddy     thrd_t thread;
26d5475af2SSiva Chandra Reddy     int old_counter_val = counter;
27*b6bc9d72SGuillaume Chatelet     ASSERT_EQ(LIBC_NAMESPACE::thrd_create(&thread, thread_func, nullptr),
28d5475af2SSiva Chandra Reddy               (int)thrd_success);
29d5475af2SSiva Chandra Reddy     int retval = thread_count + 1; // Start with a retval we dont expect.
30*b6bc9d72SGuillaume Chatelet     ASSERT_EQ(LIBC_NAMESPACE::thrd_join(thread, &retval), (int)thrd_success);
31d5475af2SSiva Chandra Reddy     ASSERT_EQ(retval, 0);
32d5475af2SSiva Chandra Reddy     ASSERT_EQ(counter, old_counter_val + 1);
33d5475af2SSiva Chandra Reddy   }
34d5475af2SSiva Chandra Reddy }
35d5475af2SSiva Chandra Reddy 
return_arg(void * arg)36d5475af2SSiva Chandra Reddy static int return_arg(void *arg) { return *reinterpret_cast<int *>(arg); }
37d5475af2SSiva Chandra Reddy 
spawn_and_join()38d5475af2SSiva Chandra Reddy void spawn_and_join() {
39d5475af2SSiva Chandra Reddy   thrd_t thread_list[thread_count];
40d5475af2SSiva Chandra Reddy   int args[thread_count];
41d5475af2SSiva Chandra Reddy 
42d5475af2SSiva Chandra Reddy   for (int i = 0; i < thread_count; ++i) {
43d5475af2SSiva Chandra Reddy     args[i] = i;
44*b6bc9d72SGuillaume Chatelet     ASSERT_EQ(
45*b6bc9d72SGuillaume Chatelet         LIBC_NAMESPACE::thrd_create(thread_list + i, return_arg, args + i),
46d5475af2SSiva Chandra Reddy         (int)thrd_success);
47d5475af2SSiva Chandra Reddy   }
48d5475af2SSiva Chandra Reddy 
49d5475af2SSiva Chandra Reddy   for (int i = 0; i < thread_count; ++i) {
50d5475af2SSiva Chandra Reddy     int retval = thread_count + 1; // Start with a retval we dont expect.
51*b6bc9d72SGuillaume Chatelet     ASSERT_EQ(LIBC_NAMESPACE::thrd_join(thread_list[i], &retval),
52d5475af2SSiva Chandra Reddy               (int)thrd_success);
53d5475af2SSiva Chandra Reddy     ASSERT_EQ(retval, i);
54d5475af2SSiva Chandra Reddy   }
55d5475af2SSiva Chandra Reddy }
56d5475af2SSiva Chandra Reddy 
TEST_MAIN()5712df3080SSiva Chandra Reddy TEST_MAIN() {
58d5475af2SSiva Chandra Reddy   create_and_join();
59d5475af2SSiva Chandra Reddy   spawn_and_join();
6012df3080SSiva Chandra Reddy   return 0;
61d5475af2SSiva Chandra Reddy }
62