1523cc097SEvgenii Stepanov // Test that Thread objects are reused. 2*f1a47181SMitch Phillips // RUN: %clangxx_hwasan -mllvm -hwasan-globals=0 -mllvm -hwasan-instrument-stack=0 %s -o %t && %env_hwasan_opts=verbose_threads=1 %run %t 2>&1 | FileCheck %s 3523cc097SEvgenii Stepanov 4523cc097SEvgenii Stepanov #include <assert.h> 5523cc097SEvgenii Stepanov #include <fcntl.h> 6523cc097SEvgenii Stepanov #include <pthread.h> 7523cc097SEvgenii Stepanov #include <stdio.h> 8523cc097SEvgenii Stepanov #include <stdlib.h> 9523cc097SEvgenii Stepanov #include <unistd.h> 10523cc097SEvgenii Stepanov 11523cc097SEvgenii Stepanov #include <sanitizer/hwasan_interface.h> 12523cc097SEvgenii Stepanov 13523cc097SEvgenii Stepanov pthread_barrier_t bar; 14523cc097SEvgenii Stepanov threadfn(void *)15523cc097SEvgenii Stepanovvoid *threadfn(void *) { 16*f1a47181SMitch Phillips pthread_barrier_wait(&bar); 17523cc097SEvgenii Stepanov return nullptr; 18523cc097SEvgenii Stepanov } 19523cc097SEvgenii Stepanov start_stop_threads()20523cc097SEvgenii Stepanovvoid start_stop_threads() { 21523cc097SEvgenii Stepanov constexpr int N = 2; 22523cc097SEvgenii Stepanov pthread_t threads[N]; 23523cc097SEvgenii Stepanov 24*f1a47181SMitch Phillips pthread_barrier_init(&bar, nullptr, N + 1); 25523cc097SEvgenii Stepanov for (auto &t : threads) 26523cc097SEvgenii Stepanov pthread_create(&t, nullptr, threadfn, nullptr); 27523cc097SEvgenii Stepanov 28*f1a47181SMitch Phillips pthread_barrier_wait(&bar); 29523cc097SEvgenii Stepanov 30523cc097SEvgenii Stepanov for (auto &t : threads) 31523cc097SEvgenii Stepanov pthread_join(t, nullptr); 32*f1a47181SMitch Phillips pthread_barrier_destroy(&bar); 33523cc097SEvgenii Stepanov } 34523cc097SEvgenii Stepanov main()35523cc097SEvgenii Stepanovint main() { 36523cc097SEvgenii Stepanov // Cut off initial threads. 37523cc097SEvgenii Stepanov // CHECK: === test start === 3896a4167bSMatt Morehouse fprintf(stderr, "=== test start ===\n"); 39523cc097SEvgenii Stepanov 40523cc097SEvgenii Stepanov // CHECK: Creating : T{{[0-9]+}} [[A:0x[0-9a-f]+]] stack: 41523cc097SEvgenii Stepanov // CHECK: Creating : T{{[0-9]+}} [[B:0x[0-9a-f]+]] stack: 42523cc097SEvgenii Stepanov start_stop_threads(); 43523cc097SEvgenii Stepanov 44523cc097SEvgenii Stepanov // CHECK-DAG: Creating : T{{[0-9]+}} [[A]] stack: 45523cc097SEvgenii Stepanov // CHECK-DAG: Creating : T{{[0-9]+}} [[B]] stack: 46523cc097SEvgenii Stepanov start_stop_threads(); 47523cc097SEvgenii Stepanov 48523cc097SEvgenii Stepanov // CHECK-DAG: Creating : T{{[0-9]+}} [[A]] stack: 49523cc097SEvgenii Stepanov // CHECK-DAG: Creating : T{{[0-9]+}} [[B]] stack: 50523cc097SEvgenii Stepanov start_stop_threads(); 51523cc097SEvgenii Stepanov 52523cc097SEvgenii Stepanov return 0; 53523cc097SEvgenii Stepanov } 54