sanitizer_posix_test.cc revision 70db33e143303752c7fe8800d15b5b31066b1e0d
1//===-- sanitizer_posix_test.cc -------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Tests for POSIX-specific code.
11//
12//===----------------------------------------------------------------------===//
13
14#include "sanitizer_common/sanitizer_platform.h"
15#if SANITIZER_POSIX
16
17#include "sanitizer_common/sanitizer_common.h"
18#include "gtest/gtest.h"
19
20#include <pthread.h>
21
22namespace __sanitizer {
23
24static pthread_key_t key;
25static bool destructor_executed;
26
27extern "C"
28void destructor(void *arg) {
29  uptr iter = reinterpret_cast<uptr>(arg);
30  if (iter > 1) {
31    ASSERT_EQ(0, pthread_setspecific(key, reinterpret_cast<void *>(iter - 1)));
32    return;
33  }
34  destructor_executed = true;
35}
36
37extern "C"
38void *thread_func(void *arg) {
39  return reinterpret_cast<void*>(pthread_setspecific(key, arg));
40}
41
42static void SpawnThread(uptr iteration) {
43  destructor_executed = false;
44  pthread_t tid;
45  ASSERT_EQ(0, pthread_create(&tid, 0, &thread_func,
46                              reinterpret_cast<void *>(iteration)));
47  void *retval;
48  ASSERT_EQ(0, pthread_join(tid, &retval));
49  ASSERT_EQ(0, retval);
50}
51
52TEST(SanitizerCommon, PthreadDestructorIterations) {
53  ASSERT_EQ(0, pthread_key_create(&key, &destructor));
54  SpawnThread(kPthreadDestructorIterations);
55  EXPECT_TRUE(destructor_executed);
56  SpawnThread(kPthreadDestructorIterations + 1);
57  EXPECT_FALSE(destructor_executed);
58}
59
60}  // namespace __sanitizer
61
62#endif  // SANITIZER_POSIX
63