xref: /llvm-project/compiler-rt/test/tsan/fd_close_race.cpp (revision f831d6fc800ccf22c1c09888fce3e3c8ebc2c992)
1*f831d6fcSDmitry Vyukov // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2*f831d6fcSDmitry Vyukov #include "test.h"
3*f831d6fcSDmitry Vyukov #include <fcntl.h>
4*f831d6fcSDmitry Vyukov #include <sys/stat.h>
5*f831d6fcSDmitry Vyukov #include <sys/types.h>
6*f831d6fcSDmitry Vyukov 
Thread(void * arg)7*f831d6fcSDmitry Vyukov void *Thread(void *arg) {
8*f831d6fcSDmitry Vyukov   char buf;
9*f831d6fcSDmitry Vyukov   read((long)arg, &buf, 1);
10*f831d6fcSDmitry Vyukov   barrier_wait(&barrier);
11*f831d6fcSDmitry Vyukov   return NULL;
12*f831d6fcSDmitry Vyukov }
13*f831d6fcSDmitry Vyukov 
main()14*f831d6fcSDmitry Vyukov int main() {
15*f831d6fcSDmitry Vyukov   barrier_init(&barrier, 2);
16*f831d6fcSDmitry Vyukov   int fd = open("/dev/random", O_RDONLY);
17*f831d6fcSDmitry Vyukov   pthread_t t;
18*f831d6fcSDmitry Vyukov   pthread_create(&t, NULL, Thread, (void *)(long)fd);
19*f831d6fcSDmitry Vyukov   barrier_wait(&barrier);
20*f831d6fcSDmitry Vyukov   close(fd);
21*f831d6fcSDmitry Vyukov   pthread_join(t, NULL);
22*f831d6fcSDmitry Vyukov   fprintf(stderr, "DONE\n");
23*f831d6fcSDmitry Vyukov }
24*f831d6fcSDmitry Vyukov 
25*f831d6fcSDmitry Vyukov // CHECK: WARNING: ThreadSanitizer: data race
26*f831d6fcSDmitry Vyukov // CHECK: DONE
27