• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- tsan_thread.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 // This file is a part of ThreadSanitizer (TSan), a race detector.
11 //
12 //===----------------------------------------------------------------------===//
13 #include "tsan_test_util.h"
14 #include "gtest/gtest.h"
15 
TEST(ThreadSanitizer,ThreadSync)16 TEST(ThreadSanitizer, ThreadSync) {
17   MainThread t0;
18   MemLoc l;
19   t0.Write1(l);
20   {
21     ScopedThread t1;
22     t1.Write1(l);
23   }
24   t0.Write1(l);
25 }
26 
TEST(ThreadSanitizer,ThreadDetach1)27 TEST(ThreadSanitizer, ThreadDetach1) {
28   ScopedThread t1(true);
29   MemLoc l;
30   t1.Write1(l);
31 }
32 
TEST(ThreadSanitizer,ThreadDetach2)33 TEST(ThreadSanitizer, ThreadDetach2) {
34   ScopedThread t1;
35   MemLoc l;
36   t1.Write1(l);
37   t1.Detach();
38 }
39 
thread_alot_func(void * arg)40 static void *thread_alot_func(void *arg) {
41   (void)arg;
42   int usleep(unsigned);
43   usleep(50);
44   return 0;
45 }
46 
TEST(DISABLED_SLOW_ThreadSanitizer,ThreadALot)47 TEST(DISABLED_SLOW_ThreadSanitizer, ThreadALot) {
48   const int kThreads = 70000;
49   const int kAlive = 1000;
50   pthread_t threads[kAlive] = {};
51   for (int i = 0; i < kThreads; i++) {
52     if (threads[i % kAlive])
53       pthread_join(threads[i % kAlive], 0);
54     pthread_create(&threads[i % kAlive], 0, thread_alot_func, 0);
55   }
56   for (int i = 0; i < kAlive; i++) {
57     pthread_join(threads[i], 0);
58   }
59 }
60