1 //===-- Tests for TSS API like tss_set, tss_get etc. ----------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "src/threads/thrd_create.h"
10 #include "src/threads/thrd_exit.h"
11 #include "src/threads/thrd_join.h"
12 #include "src/threads/tss_create.h"
13 #include "src/threads/tss_delete.h"
14 #include "src/threads/tss_get.h"
15 #include "src/threads/tss_set.h"
16 #include "test/IntegrationTest/test.h"
20 static constexpr int THREAD_DATA_INITVAL
= 0x1234;
21 static constexpr int THREAD_DATA_FINIVAL
= 0x4321;
22 static constexpr int THREAD_RUN_VAL
= 0x600D;
24 int child_thread_data
= THREAD_DATA_INITVAL
;
25 int main_thread_data
= THREAD_DATA_INITVAL
;
28 void dtor(void *data
) {
29 auto *v
= reinterpret_cast<int *>(data
);
30 *v
= THREAD_DATA_FINIVAL
;
34 ASSERT_EQ(LIBC_NAMESPACE::tss_set(key
, &child_thread_data
), thrd_success
);
35 int *d
= reinterpret_cast<int *>(LIBC_NAMESPACE::tss_get(key
));
36 ASSERT_TRUE(d
!= nullptr);
37 ASSERT_EQ(&child_thread_data
, d
);
38 ASSERT_EQ(*d
, THREAD_DATA_INITVAL
);
39 *reinterpret_cast<int *>(obj
) = THREAD_RUN_VAL
;
44 ASSERT_EQ(LIBC_NAMESPACE::tss_create(&key
, &dtor
), thrd_success
);
45 ASSERT_EQ(LIBC_NAMESPACE::tss_set(key
, &main_thread_data
), thrd_success
);
46 int *d
= reinterpret_cast<int *>(LIBC_NAMESPACE::tss_get(key
));
47 ASSERT_TRUE(d
!= nullptr);
48 ASSERT_EQ(&main_thread_data
, d
);
49 ASSERT_EQ(*d
, THREAD_DATA_INITVAL
);
53 ASSERT_EQ(LIBC_NAMESPACE::thrd_create(&th
, &func
, &arg
), thrd_success
);
54 int retval
= THREAD_DATA_INITVAL
; // Init to some non-zero val.
55 ASSERT_EQ(LIBC_NAMESPACE::thrd_join(th
, &retval
), thrd_success
);
57 ASSERT_EQ(arg
, THREAD_RUN_VAL
);
58 ASSERT_EQ(child_thread_data
, THREAD_DATA_FINIVAL
);
60 LIBC_NAMESPACE::tss_delete(key
);