170db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev//===-- sanitizer_posix_test.cc -------------------------------------------===// 270db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// 370db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// The LLVM Compiler Infrastructure 470db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// 570db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// This file is distributed under the University of Illinois Open Source 670db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// License. See LICENSE.TXT for details. 770db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// 870db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev//===----------------------------------------------------------------------===// 970db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// 1070db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// Tests for POSIX-specific code. 1170db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev// 1270db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev//===----------------------------------------------------------------------===// 1370db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 1470db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev#include "sanitizer_common/sanitizer_platform.h" 1570db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev#if SANITIZER_POSIX 1670db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 1770db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev#include "sanitizer_common/sanitizer_common.h" 1870db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev#include "gtest/gtest.h" 1970db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 2070db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev#include <pthread.h> 2170db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 2270db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevnamespace __sanitizer { 2370db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 2470db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevstatic pthread_key_t key; 2570db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevstatic bool destructor_executed; 2670db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 2770db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevextern "C" 2870db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevvoid destructor(void *arg) { 2970db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev uptr iter = reinterpret_cast<uptr>(arg); 3070db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev if (iter > 1) { 3170db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev ASSERT_EQ(0, pthread_setspecific(key, reinterpret_cast<void *>(iter - 1))); 3270db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev return; 3370db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev } 3470db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev destructor_executed = true; 3570db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev} 3670db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 3770db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevextern "C" 3870db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevvoid *thread_func(void *arg) { 3970db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev return reinterpret_cast<void*>(pthread_setspecific(key, arg)); 4070db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev} 4170db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 4270db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveevstatic void SpawnThread(uptr iteration) { 4370db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev destructor_executed = false; 4470db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev pthread_t tid; 4570db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev ASSERT_EQ(0, pthread_create(&tid, 0, &thread_func, 4670db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev reinterpret_cast<void *>(iteration))); 4770db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev void *retval; 4870db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev ASSERT_EQ(0, pthread_join(tid, &retval)); 4970db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev ASSERT_EQ(0, retval); 5070db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev} 5170db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 5270db33e143303752c7fe8800d15b5b31066b1e0dSergey MatveevTEST(SanitizerCommon, PthreadDestructorIterations) { 5370db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev ASSERT_EQ(0, pthread_key_create(&key, &destructor)); 5470db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev SpawnThread(kPthreadDestructorIterations); 5570db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev EXPECT_TRUE(destructor_executed); 5670db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev SpawnThread(kPthreadDestructorIterations + 1); 5770db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev EXPECT_FALSE(destructor_executed); 5870db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev} 5970db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 6070db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev} // namespace __sanitizer 6170db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev 6270db33e143303752c7fe8800d15b5b31066b1e0dSergey Matveev#endif // SANITIZER_POSIX 63