15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <pthread.h> 3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stdio.h> 4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stddef.h> 5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <unistd.h> 6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanypthread_mutex_t Mtx; 8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint Global; 9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid *Thread1(void *x) { 11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_mutex_init(&Mtx, 0); 12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_mutex_lock(&Mtx); 13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Global = 42; 14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_mutex_unlock(&Mtx); 15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany return NULL; 16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid *Thread2(void *x) { 1963a22f073dcdfbabc492ca4c9eb06d0571915570Dmitry Vyukov sleep(1); 20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_mutex_lock(&Mtx); 21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Global = 43; 22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_mutex_unlock(&Mtx); 23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany return NULL; 24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint main() { 27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_t t[2]; 28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_create(&t[0], NULL, Thread1, NULL); 29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_create(&t[1], NULL, Thread2, NULL); 30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_join(t[0], NULL); 31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_join(t[1], NULL); 32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany pthread_mutex_destroy(&Mtx); 33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany return 0; 34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// CHECK: WARNING: ThreadSanitizer: data race 370a07b354fe95d50911c620b42fc031868ef15cc1Dmitry Vyukov// CHECK-NEXT: Atomic read of size 1 at {{.*}} by thread T2: 38ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov// CHECK-NEXT: #0 pthread_mutex_lock 393168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT: #1 Thread2{{.*}} {{.*}}race_on_mutex.c:20{{(:3)?}} ({{.*}}) 40ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// CHECK: Previous write of size 1 at {{.*}} by thread T1: 41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// CHECK-NEXT: #0 pthread_mutex_init {{.*}} ({{.*}}) 423168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT: #1 Thread1{{.*}} {{.*}}race_on_mutex.c:11{{(:3)?}} ({{.*}}) 43