12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov#include <pthread.h>
3983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov#include <stdio.h>
4983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov#include <unistd.h>
5983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov#include <sys/types.h>
6983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov#include <sys/socket.h>
7983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov
8983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukovint fds[2];
9983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukovint X;
10983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov
11983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukovvoid *Thread1(void *x) {
12983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  X = 42;
13983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  write(fds[1], "a", 1);
14983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  close(fds[1]);
15983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  return NULL;
16983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov}
17983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov
18983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukovvoid *Thread2(void *x) {
19983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  char buf;
20983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  while (read(fds[0], &buf, 1) != 1) {
21983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  }
22983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  X = 43;
23983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  close(fds[0]);
24983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  return NULL;
25983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov}
26983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov
27983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukovint main() {
28983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
29983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  pthread_t t[2];
30983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  pthread_create(&t[0], NULL, Thread1, NULL);
31983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  pthread_create(&t[1], NULL, Thread2, NULL);
32983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  pthread_join(t[0], NULL);
33983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov  pthread_join(t[1], NULL);
34bd88c187a9eaed794b9098aaf147f9dada8c5131Dmitry Vyukov  printf("OK\n");
35983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov}
36983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov
37983518e360a179d92bdbddebe05a87db3c6cc3c0Dmitry Vyukov// CHECK-NOT: WARNING: ThreadSanitizer: data race
38