1//===-- Test handling of thread local data --------------------------------===//
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/thread.h"
10#include "test/IntegrationTest/test.h"
11
12static constexpr int INIT_VAL = 100;
13static constexpr int UPDATE_VAL = 123;
14
15static thread_local int tlval = INIT_VAL;
16
17// This function updates the tlval and returns its old value.
18int func(void *) {
19 int old_tlval = tlval;
20 tlval = UPDATE_VAL;
21 return old_tlval;
22}
23
24void thread_local_test() {
25 int retval;
26
27 LIBC_NAMESPACE::Thread th1;
28 th1.run(func, arg: nullptr, stack: nullptr, stacksize: 0);
29 th1.join(val: &retval);
30 ASSERT_EQ(retval, INIT_VAL);
31
32 LIBC_NAMESPACE::Thread th2;
33 th2.run(func, arg: nullptr, stack: nullptr, stacksize: 0);
34 th2.join(val: &retval);
35 ASSERT_EQ(retval, INIT_VAL);
36}
37
38TEST_MAIN() {
39 // From the main thread, we will update the main thread's tlval.
40 // This should not affect the child thread's tlval;
41 ASSERT_EQ(tlval, INIT_VAL);
42 tlval = UPDATE_VAL;
43 ASSERT_EQ(tlval, UPDATE_VAL);
44 thread_local_test();
45 return 0;
46}
47

source code of libc/test/integration/src/__support/threads/thread_tls_test.cpp