Merge "Add test for thread_local keyword."
This commit is contained in:
commit
cd79a59b18
@ -287,6 +287,10 @@ bionic-unit-tests_shared_libraries_target := \
|
|||||||
libdl_preempt_test_1 \
|
libdl_preempt_test_1 \
|
||||||
libdl_preempt_test_2
|
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))
|
ifneq ($(filter $(TARGET_ARCH),arm arm64),$(TARGET_ARCH))
|
||||||
bionic-unit-tests_shared_libraries_target += libdl_test_df_1_global
|
bionic-unit-tests_shared_libraries_target += libdl_test_df_1_global
|
||||||
endif
|
endif
|
||||||
|
@ -20,6 +20,36 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
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<std::string*>(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);
|
extern "C" int __cxa_thread_atexit_impl(void (*fn)(void*), void* arg, void* dso_handle);
|
||||||
|
|
||||||
static void thread_atexit_fn1(void* arg) {
|
static void thread_atexit_fn1(void* arg) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user