15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
283b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <pthread.h>
383b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <stddef.h>
483b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <stdio.h>
583b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <string.h>
683b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany#include <unistd.h>
783b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany
85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint x[4], z[4];
983b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany
107acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryanyvoid *MemCpyThread(void *a) {
117acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  memcpy((int*)a, z, 16);
127acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  return NULL;
137acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany}
147acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany
157acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryanyvoid *MemSetThread(void *a) {
167acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  sleep(1);
177acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  memset((int*)a, 0, 16);
1883b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany  return NULL;
1983b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany}
2083b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany
2183b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryanyint main() {
2283b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany  pthread_t t[2];
237acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  // Race on x between memcpy and memset
247acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  pthread_create(&t[0], NULL, MemCpyThread, x);
257acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  pthread_create(&t[1], NULL, MemSetThread, x);
267acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  pthread_join(t[0], NULL);
277acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany  pthread_join(t[1], NULL);
2883b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany  printf("PASS\n");
2983b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany  return 0;
3083b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany}
3183b47072ff373766b8f424e31c278cfa31ab46a3Kostya Serebryany
327acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK: WARNING: ThreadSanitizer: data race
337acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK:   #0 memset
347acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK:   #1 MemSetThread
357acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK:  Previous write
367acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK:   #0 memcpy
377acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany// CHECK:   #1 MemCpyThread
387acbcb9c03df03d80e9ff65c84e71e6942c70ddcKostya Serebryany
39