104b2ada5SDmitry Vyukov // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s
204b2ada5SDmitry Vyukov #include "syscall.h"
304b2ada5SDmitry Vyukov #include "../test.h"
404b2ada5SDmitry Vyukov #include <errno.h>
504b2ada5SDmitry Vyukov #include <sys/types.h>
604b2ada5SDmitry Vyukov #include <sys/wait.h>
704b2ada5SDmitry Vyukov 
804b2ada5SDmitry Vyukov int pipefd[2];
9*dbe36e40SDmitry Vyukov unsigned long long buf[2];
1004b2ada5SDmitry Vyukov 
thr(void * p)1104b2ada5SDmitry Vyukov static void *thr(void *p) {
1204b2ada5SDmitry Vyukov   barrier_wait(&barrier);
1304b2ada5SDmitry Vyukov   mywrite(pipefd[1], buf, sizeof(buf));
1404b2ada5SDmitry Vyukov   return 0;
1504b2ada5SDmitry Vyukov }
1604b2ada5SDmitry Vyukov 
main()1704b2ada5SDmitry Vyukov int main() {
1804b2ada5SDmitry Vyukov   barrier_init(&barrier, 2);
1904b2ada5SDmitry Vyukov   if (mypipe(pipefd))
2004b2ada5SDmitry Vyukov     exit((perror("pipe"), 1));
2104b2ada5SDmitry Vyukov   mywrite(pipefd[1], buf, sizeof(buf));
2204b2ada5SDmitry Vyukov   pthread_t th;
2304b2ada5SDmitry Vyukov   pthread_create(&th, 0, thr, 0);
2404b2ada5SDmitry Vyukov   myread(pipefd[0], buf, sizeof(buf));
2504b2ada5SDmitry Vyukov   barrier_wait(&barrier);
2604b2ada5SDmitry Vyukov   pthread_join(th, 0);
2704b2ada5SDmitry Vyukov   fprintf(stderr, "DONE\n");
2804b2ada5SDmitry Vyukov }
2904b2ada5SDmitry Vyukov 
3004b2ada5SDmitry Vyukov // CHECK: WARNING: ThreadSanitizer: data race
3104b2ada5SDmitry Vyukov // CHECK:   Read of size 8
3204b2ada5SDmitry Vyukov // CHECK:     #0 mywrite
3304b2ada5SDmitry Vyukov // CHECK:     #1 thr
3404b2ada5SDmitry Vyukov // CHECK:   Previous write of size 8
3504b2ada5SDmitry Vyukov // CHECK:     #0 myread
3604b2ada5SDmitry Vyukov // CHECK:     #1 main
3704b2ada5SDmitry Vyukov // CHECK: DONE
38