1 // Test that Thread objects are reused. 2 // RUN: %clangxx_hwasan -mllvm -hwasan-instrument-stack=0 %s -o %t && %env_hwasan_opts=verbose_threads=1 %run %t 2>&1 | FileCheck %s 3 4 #include <assert.h> 5 #include <fcntl.h> 6 #include <pthread.h> 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <unistd.h> 10 11 #include <sanitizer/hwasan_interface.h> 12 13 #include "utils.h" 14 15 pthread_barrier_t bar; 16 17 void *threadfn(void *) { 18 pthread_barrier_wait(UNTAG(&bar)); 19 return nullptr; 20 } 21 22 void start_stop_threads() { 23 constexpr int N = 2; 24 pthread_t threads[N]; 25 26 pthread_barrier_init(UNTAG(&bar), nullptr, N + 1); 27 for (auto &t : threads) 28 pthread_create(&t, nullptr, threadfn, nullptr); 29 30 pthread_barrier_wait(UNTAG(&bar)); 31 32 for (auto &t : threads) 33 pthread_join(t, nullptr); 34 pthread_barrier_destroy(UNTAG(&bar)); 35 } 36 37 int main() { 38 // Cut off initial threads. 39 // CHECK: === test start === 40 fprintf(stderr, "=== test start ===\n"); 41 42 // CHECK: Creating : T{{[0-9]+}} [[A:0x[0-9a-f]+]] stack: 43 // CHECK: Creating : T{{[0-9]+}} [[B:0x[0-9a-f]+]] stack: 44 start_stop_threads(); 45 46 // CHECK-DAG: Creating : T{{[0-9]+}} [[A]] stack: 47 // CHECK-DAG: Creating : T{{[0-9]+}} [[B]] stack: 48 start_stop_threads(); 49 50 // CHECK-DAG: Creating : T{{[0-9]+}} [[A]] stack: 51 // CHECK-DAG: Creating : T{{[0-9]+}} [[B]] stack: 52 start_stop_threads(); 53 54 return 0; 55 } 56