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