12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov#include <pthread.h> 3c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov#include <stdio.h> 4c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov#include <unistd.h> 5c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov#include <sys/types.h> 6c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov#include <sys/stat.h> 7c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov#include <fcntl.h> 8c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov 9c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukovint fds[2]; 10c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov 11c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukovvoid *Thread1(void *x) { 12c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov char buf; 13c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov read(fds[0], &buf, 1); 14c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov close(fds[0]); 15c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov return 0; 16c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov} 17c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov 18c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukovvoid *Thread2(void *x) { 19c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov close(fds[1]); 20c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov return 0; 21c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov} 22c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov 23c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukovint main() { 24c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov fds[0] = open("/dev/random", O_RDONLY); 25c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov fds[1] = dup2(fds[0], 100); 26c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov pthread_t t[2]; 27c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov pthread_create(&t[0], NULL, Thread1, NULL); 28c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov pthread_create(&t[1], NULL, Thread2, NULL); 29c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov pthread_join(t[0], NULL); 30c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov pthread_join(t[1], NULL); 31bd88c187a9eaed794b9098aaf147f9dada8c5131Dmitry Vyukov printf("OK\n"); 32c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov} 33c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov 34c78839f0288e5af16101b5fd3b455e1a88cc1c5eDmitry Vyukov// CHECK-NOT: WARNING: ThreadSanitizer: data race 35