1*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2*bcaeed49SFangrui Song #include <stdio.h>
3*bcaeed49SFangrui Song #include <stdlib.h>
4*bcaeed49SFangrui Song
5*bcaeed49SFangrui Song // Defined by tsan.
6*bcaeed49SFangrui Song extern "C" FILE *__interceptor_fopen(const char *file, const char *mode);
7*bcaeed49SFangrui Song extern "C" int __interceptor_fileno(FILE *f);
8*bcaeed49SFangrui Song
fopen(const char * file,const char * mode)9*bcaeed49SFangrui Song extern "C" FILE *fopen(const char *file, const char *mode) {
10*bcaeed49SFangrui Song static int first = 0;
11*bcaeed49SFangrui Song if (__sync_lock_test_and_set(&first, 1) == 0)
12*bcaeed49SFangrui Song printf("user fopen\n");
13*bcaeed49SFangrui Song return __interceptor_fopen(file, mode);
14*bcaeed49SFangrui Song }
15*bcaeed49SFangrui Song
fileno(FILE * f)16*bcaeed49SFangrui Song extern "C" int fileno(FILE *f) {
17*bcaeed49SFangrui Song static int first = 0;
18*bcaeed49SFangrui Song if (__sync_lock_test_and_set(&first, 1) == 0)
19*bcaeed49SFangrui Song printf("user fileno\n");
20*bcaeed49SFangrui Song return 1;
21*bcaeed49SFangrui Song }
22*bcaeed49SFangrui Song
main()23*bcaeed49SFangrui Song int main() {
24*bcaeed49SFangrui Song FILE *f = fopen("/dev/zero", "r");
25*bcaeed49SFangrui Song if (f) {
26*bcaeed49SFangrui Song char buf;
27*bcaeed49SFangrui Song fread(&buf, 1, 1, f);
28*bcaeed49SFangrui Song fclose(f);
29*bcaeed49SFangrui Song }
30*bcaeed49SFangrui Song }
31*bcaeed49SFangrui Song
32*bcaeed49SFangrui Song // CHECK: user fopen
33*bcaeed49SFangrui Song // CHECK-NOT: ThreadSanitizer
34*bcaeed49SFangrui Song
35