mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-11 23:43:15 +00:00
parent
f68e655312
commit
dd92ab126b
@ -1094,6 +1094,65 @@ static void test_cleanup()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static pthread_key_t key;
|
||||||
|
static bool key_destructor_func_called = false;
|
||||||
|
|
||||||
|
static void test_tls_data()
|
||||||
|
{
|
||||||
|
int test;
|
||||||
|
|
||||||
|
if (pthread_setspecific(key, &test) != 0) {
|
||||||
|
Genode::error("pthread_setspecific() failed");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_getspecific(key) != &test) {
|
||||||
|
Genode::error("pthread_getspecific() failed");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void key_destructor_func(void *value)
|
||||||
|
{
|
||||||
|
key_destructor_func_called = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *thread_tls_func(void *)
|
||||||
|
{
|
||||||
|
test_tls_data();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void test_tls()
|
||||||
|
{
|
||||||
|
pthread_t t;
|
||||||
|
void *retval;
|
||||||
|
|
||||||
|
if (pthread_key_create(&key, key_destructor_func) != 0) {
|
||||||
|
Genode::error("pthread_key_create() failed");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
test_tls_data();
|
||||||
|
|
||||||
|
pthread_create(&t, 0, thread_tls_func, nullptr);
|
||||||
|
pthread_join(t, &retval);
|
||||||
|
|
||||||
|
if (pthread_key_delete(key) != 0) {
|
||||||
|
Genode::error("pthread_key_delete() failed");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!key_destructor_func_called) {
|
||||||
|
Genode::error("TLS key destructor function was not called");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
printf("--- pthread test ---\n");
|
printf("--- pthread test ---\n");
|
||||||
@ -1111,6 +1170,7 @@ int main(int argc, char **argv)
|
|||||||
test_lock_and_sleep();
|
test_lock_and_sleep();
|
||||||
test_cond();
|
test_cond();
|
||||||
test_cleanup();
|
test_cleanup();
|
||||||
|
test_tls();
|
||||||
|
|
||||||
printf("--- returning from main ---\n");
|
printf("--- returning from main ---\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user