From 947adedebc480917b8490bc16e8b2d82b441095a Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Thu, 26 Mar 2015 11:07:04 -0700 Subject: [PATCH] Add test for thread_local keyword. For gcc only for the time being. Bug: 19800080 Bug: 16696563 Change-Id: Ifaa59a131ca2d9030554cee7ce631dcb1d081938 --- tests/Android.mk | 4 ++++ tests/__cxa_thread_atexit_test.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tests/Android.mk b/tests/Android.mk index 8804b71b8..995877eaf 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -287,6 +287,10 @@ bionic-unit-tests_shared_libraries_target := \ libdl_preempt_test_1 \ libdl_preempt_test_2 +# TODO: clang support for thread_local on arm is done via __aeabi_read_tp() +# which bionic does not support. Reenable this once this question is resolved. +bionic-unit-tests_clang_target := false + ifneq ($(filter $(TARGET_ARCH),arm arm64),$(TARGET_ARCH)) bionic-unit-tests_shared_libraries_target += libdl_test_df_1_global endif diff --git a/tests/__cxa_thread_atexit_test.cpp b/tests/__cxa_thread_atexit_test.cpp index 017731498..fea60b719 100644 --- a/tests/__cxa_thread_atexit_test.cpp +++ b/tests/__cxa_thread_atexit_test.cpp @@ -20,6 +20,36 @@ #include +static std::string class_with_dtor_output; + +class ClassWithDtor { + public: + void set_message(const std::string& msg) { + message = msg; + } + + ~ClassWithDtor() { + class_with_dtor_output += message; + } + private: + std::string message; +}; + +thread_local ClassWithDtor class_with_dtor; + +static void* thread_nop(void* arg) { + class_with_dtor.set_message(*static_cast(arg)); + return nullptr; +} + +TEST(thread_local, smoke) { + std::string msg("dtor called."); + pthread_t t; + ASSERT_EQ(0, pthread_create(&t, nullptr, thread_nop, &msg)); + ASSERT_EQ(0, pthread_join(t, nullptr)); + ASSERT_EQ("dtor called.", class_with_dtor_output); +} + extern "C" int __cxa_thread_atexit_impl(void (*fn)(void*), void* arg, void* dso_handle); static void thread_atexit_fn1(void* arg) {