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