tests: Add tls test
This commit is contained in:
parent
4a00cb7d55
commit
5e4e174d61
|
@ -10,6 +10,7 @@ set(USERSPACE_TESTS
|
|||
test-shared
|
||||
test-sort
|
||||
test-tcp
|
||||
test-tls
|
||||
test-udp
|
||||
test-unix-socket
|
||||
test-window
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
add_library(libtest-tls SHARED lib.cpp)
|
||||
banan_link_library(libtest-tls libc)
|
||||
target_link_options(libtest-tls PRIVATE -nolibc)
|
||||
set_target_properties(libtest-tls PROPERTIES LINK_FLAGS "-Wl,-soname,libtest-tls.so")
|
||||
|
||||
add_executable(test-tls main.cpp)
|
||||
banan_link_library(test-tls libc)
|
||||
banan_link_library(test-tls libtest-tls)
|
||||
|
||||
install(TARGETS test-tls OPTIONAL)
|
||||
install(TARGETS libtest-tls OPTIONAL)
|
|
@ -0,0 +1,35 @@
|
|||
#include <stdio.h>
|
||||
|
||||
extern thread_local int tls_in_executable1;
|
||||
extern thread_local int tls_in_executable2;
|
||||
|
||||
thread_local int tls_in_library1 = 1;
|
||||
thread_local int tls_in_library2 = 1;
|
||||
|
||||
void test_tls_exec_lib1()
|
||||
{
|
||||
printf(" exec in lib: %d (%p)\n", tls_in_executable1, &tls_in_executable1);
|
||||
tls_in_executable1 = 3;
|
||||
printf(" exec in lib: %d (%p)\n", tls_in_executable1, &tls_in_executable1);
|
||||
}
|
||||
|
||||
void test_tls_exec_lib2()
|
||||
{
|
||||
printf(" exec in lib: %d (%p)\n", tls_in_executable2, &tls_in_executable2);
|
||||
tls_in_executable2 = 3;
|
||||
printf(" exec in lib: %d (%p)\n", tls_in_executable2, &tls_in_executable2);
|
||||
}
|
||||
|
||||
void test_tls_lib_lib1()
|
||||
{
|
||||
printf(" lib in lib: %d (%p)\n", tls_in_library1, &tls_in_library1);
|
||||
tls_in_library1 = 3;
|
||||
printf(" lib in lib: %d (%p)\n", tls_in_library1, &tls_in_library1);
|
||||
}
|
||||
|
||||
void test_tls_lib_lib2()
|
||||
{
|
||||
printf(" lib in lib: %d (%p)\n", tls_in_library2, &tls_in_library2);
|
||||
tls_in_library2 = 3;
|
||||
printf(" lib in lib: %d (%p)\n", tls_in_library2, &tls_in_library2);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
|
||||
extern void test_tls_exec_lib1();
|
||||
extern void test_tls_exec_lib2();
|
||||
|
||||
extern void test_tls_lib_lib1();
|
||||
extern void test_tls_lib_lib2();
|
||||
|
||||
extern thread_local int tls_in_library1;
|
||||
extern thread_local int tls_in_library2;
|
||||
|
||||
thread_local int tls_in_executable1 = 1;
|
||||
thread_local int tls_in_executable2 = 1;
|
||||
|
||||
void run_test()
|
||||
{
|
||||
printf("running on thread %d (expected 1, 2, 2, 3)\n", pthread_self());
|
||||
printf(" exec in exec: %d (%p)\n", tls_in_executable1, &tls_in_executable1);
|
||||
tls_in_executable1 = 2;
|
||||
printf(" exec in exec: %d (%p)\n", tls_in_executable1, &tls_in_executable1);
|
||||
test_tls_exec_lib1();
|
||||
|
||||
printf("running on thread %d (expected 1, 2, 2, 3)\n", pthread_self());
|
||||
printf(" exec in exec: %d (%p)\n", tls_in_executable2, &tls_in_executable2);
|
||||
tls_in_executable2 = 2;
|
||||
printf(" exec in exec: %d (%p)\n", tls_in_executable2, &tls_in_executable2);
|
||||
test_tls_exec_lib2();
|
||||
|
||||
printf("running on thread %d (expected 1, 2, 2, 3)\n", pthread_self());
|
||||
printf(" lib in exec: %d (%p)\n", tls_in_library1, &tls_in_library1);
|
||||
tls_in_library1 = 2;
|
||||
printf(" lib in exec: %d (%p)\n", tls_in_library1, &tls_in_library1);
|
||||
test_tls_lib_lib1();
|
||||
|
||||
printf("running on thread %d (expected 1, 2, 2, 3)\n", pthread_self());
|
||||
printf(" lib in exec: %d (%p)\n", tls_in_library2, &tls_in_library2);
|
||||
tls_in_library2 = 2;
|
||||
printf(" lib in exec: %d (%p)\n", tls_in_library2, &tls_in_library2);
|
||||
test_tls_lib_lib2();
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
run_test();
|
||||
|
||||
#if 0
|
||||
pthread_t tid;
|
||||
pthread_create(&tid, nullptr,
|
||||
[](void*) -> void* {
|
||||
run_test();
|
||||
return nullptr;
|
||||
}, nullptr
|
||||
);
|
||||
pthread_join(tid, nullptr);
|
||||
#endif
|
||||
}
|
Loading…
Reference in New Issue