1 //===-- tsan_thread.cpp ---------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is a part of ThreadSanitizer (TSan), a race detector. 10 // 11 //===----------------------------------------------------------------------===// 12 #include "tsan_test_util.h" 13 #include "gtest/gtest.h" 14 15 TEST(ThreadSanitizer, ThreadSync) { 16 MainThread t0; 17 MemLoc l; 18 t0.Write1(l); 19 { 20 ScopedThread t1; 21 t1.Write1(l); 22 } 23 t0.Write1(l); 24 } 25 26 TEST(ThreadSanitizer, ThreadDetach1) { 27 ScopedThread t1(true); 28 MemLoc l; 29 t1.Write1(l); 30 } 31 32 TEST(ThreadSanitizer, ThreadDetach2) { 33 ScopedThread t1; 34 MemLoc l; 35 t1.Write1(l); 36 t1.Detach(); 37 } 38 39 static void *thread_alot_func(void *arg) { 40 (void)arg; 41 int usleep(unsigned); 42 usleep(50); 43 return 0; 44 } 45 46 TEST(DISABLED_SLOW_ThreadSanitizer, ThreadALot) { 47 const int kThreads = 70000; 48 const int kAlive = 1000; 49 pthread_t threads[kAlive] = {}; 50 for (int i = 0; i < kThreads; i++) { 51 if (threads[i % kAlive]) 52 pthread_join(threads[i % kAlive], 0); 53 pthread_create(&threads[i % kAlive], 0, thread_alot_func, 0); 54 } 55 for (int i = 0; i < kAlive; i++) { 56 pthread_join(threads[i], 0); 57 } 58 } 59