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