tests: Add tls test

This commit is contained in:
Bananymous 2025-06-16 15:07:26 +03:00
parent 4a00cb7d55
commit 5e4e174d61
4 changed files with 104 additions and 0 deletions

View File

@ -10,6 +10,7 @@ set(USERSPACE_TESTS
test-shared
test-sort
test-tcp
test-tls
test-udp
test-unix-socket
test-window

View File

@ -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)

View File

@ -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);
}

View File

@ -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
}