1bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -o %t -DORDER1 && %deflake %run %t | FileCheck %s 2bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -o %t -DORDER2 && %deflake %run %t | FileCheck %s 3bcaeed49SFangrui Song #include "test.h" 4bcaeed49SFangrui Song 5bcaeed49SFangrui Song volatile int X; 6bcaeed49SFangrui Song volatile int N; 7bcaeed49SFangrui Song void (*volatile F)(); 8bcaeed49SFangrui Song foo()9bcaeed49SFangrui Songstatic void foo() { 10bcaeed49SFangrui Song if (--N == 0) 11bcaeed49SFangrui Song X = 42; 12bcaeed49SFangrui Song else 13bcaeed49SFangrui Song F(); 14bcaeed49SFangrui Song } 15bcaeed49SFangrui Song Thread(void * p)16bcaeed49SFangrui Songvoid *Thread(void *p) { 17bcaeed49SFangrui Song #ifdef ORDER1 18bcaeed49SFangrui Song barrier_wait(&barrier); 19bcaeed49SFangrui Song #endif 20bcaeed49SFangrui Song F(); 21bcaeed49SFangrui Song #ifdef ORDER2 22bcaeed49SFangrui Song barrier_wait(&barrier); 23bcaeed49SFangrui Song #endif 24bcaeed49SFangrui Song return 0; 25bcaeed49SFangrui Song } 26bcaeed49SFangrui Song RoundUp(size_t n,size_t to)27bcaeed49SFangrui Songstatic size_t RoundUp(size_t n, size_t to) { 28bcaeed49SFangrui Song return ((n + to - 1) / to) * to; 29bcaeed49SFangrui Song } 30bcaeed49SFangrui Song main()31bcaeed49SFangrui Songint main() { 32bcaeed49SFangrui Song barrier_init(&barrier, 2); 33bcaeed49SFangrui Song N = 50000; 34bcaeed49SFangrui Song F = foo; 35bcaeed49SFangrui Song pthread_t t; 36bcaeed49SFangrui Song pthread_attr_t a; 37bcaeed49SFangrui Song pthread_attr_init(&a); 38bcaeed49SFangrui Song size_t stack_size = N * 256 + (1 << 20); 39bcaeed49SFangrui Song stack_size = RoundUp(stack_size, 0x10000); // round the stack size to 64k 40bcaeed49SFangrui Song int ret = pthread_attr_setstacksize(&a, stack_size); 41bcaeed49SFangrui Song if (ret) abort(); 42bcaeed49SFangrui Song pthread_create(&t, &a, Thread, 0); 43bcaeed49SFangrui Song #ifdef ORDER2 44bcaeed49SFangrui Song barrier_wait(&barrier); 45bcaeed49SFangrui Song #endif 46bcaeed49SFangrui Song X = 43; 47bcaeed49SFangrui Song #ifdef ORDER1 48bcaeed49SFangrui Song barrier_wait(&barrier); 49bcaeed49SFangrui Song #endif 50bcaeed49SFangrui Song 51bcaeed49SFangrui Song pthread_join(t, 0); 52bcaeed49SFangrui Song } 53bcaeed49SFangrui Song 54bcaeed49SFangrui Song // CHECK: WARNING: ThreadSanitizer: data race 55bcaeed49SFangrui Song // CHECK: #100 foo 56*a1e7e401SKazuaki Ishizaki // We must output sufficiently large stack (at least 100 frames) 57bcaeed49SFangrui Song 58