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