xref: /llvm-project/compiler-rt/test/tsan/thread_name2.cpp (revision bcaeed49cb063de9fe504aa29e1cadff8a7be710)
1*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2*bcaeed49SFangrui Song #include "test.h"
3*bcaeed49SFangrui Song 
4*bcaeed49SFangrui Song // OS X doesn't have pthread_setname_np(tid, name).
5*bcaeed49SFangrui Song // UNSUPPORTED: darwin
6*bcaeed49SFangrui Song 
7*bcaeed49SFangrui Song #if defined(__FreeBSD__)
8*bcaeed49SFangrui Song #include <pthread_np.h>
9*bcaeed49SFangrui Song #define tsan_pthread_setname_np pthread_set_name_np
10*bcaeed49SFangrui Song #elif defined(__NetBSD__)
11*bcaeed49SFangrui Song #define tsan_pthread_setname_np(a, b) pthread_setname_np((a), "%s", (void *)(b))
12*bcaeed49SFangrui Song #else
13*bcaeed49SFangrui Song #define tsan_pthread_setname_np pthread_setname_np
14*bcaeed49SFangrui Song #endif
15*bcaeed49SFangrui Song 
16*bcaeed49SFangrui Song long long Global;
17*bcaeed49SFangrui Song 
Thread1(void * x)18*bcaeed49SFangrui Song void *Thread1(void *x) {
19*bcaeed49SFangrui Song   barrier_wait(&barrier);
20*bcaeed49SFangrui Song   Global++;
21*bcaeed49SFangrui Song   return 0;
22*bcaeed49SFangrui Song }
23*bcaeed49SFangrui Song 
Thread2(void * x)24*bcaeed49SFangrui Song void *Thread2(void *x) {
25*bcaeed49SFangrui Song   tsan_pthread_setname_np(pthread_self(), "foobar2");
26*bcaeed49SFangrui Song   Global--;
27*bcaeed49SFangrui Song   barrier_wait(&barrier);
28*bcaeed49SFangrui Song   return 0;
29*bcaeed49SFangrui Song }
30*bcaeed49SFangrui Song 
main()31*bcaeed49SFangrui Song int main() {
32*bcaeed49SFangrui Song   barrier_init(&barrier, 3);
33*bcaeed49SFangrui Song   pthread_t t[2];
34*bcaeed49SFangrui Song   pthread_create(&t[0], 0, Thread1, 0);
35*bcaeed49SFangrui Song   pthread_create(&t[1], 0, Thread2, 0);
36*bcaeed49SFangrui Song   tsan_pthread_setname_np(t[0], "foobar1");
37*bcaeed49SFangrui Song   barrier_wait(&barrier);
38*bcaeed49SFangrui Song   pthread_join(t[0], NULL);
39*bcaeed49SFangrui Song   pthread_join(t[1], NULL);
40*bcaeed49SFangrui Song }
41*bcaeed49SFangrui Song 
42*bcaeed49SFangrui Song // CHECK: WARNING: ThreadSanitizer: data race
43*bcaeed49SFangrui Song // CHECK:   Thread T1 'foobar1'
44*bcaeed49SFangrui Song // CHECK:   Thread T2 'foobar2'
45