benign_race.cc revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko#include <pthread.h> 3743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko#include <stdio.h> 4743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko#include <unistd.h> 5743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko 6743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenkoint Global; 7743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenkoint WTFGlobal; 8743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko 9743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenkoextern "C" { 10743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenkovoid AnnotateBenignRaceSized(const char *f, int l, 11743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko void *mem, unsigned int size, const char *desc); 12743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenkovoid WTFAnnotateBenignRaceSized(const char *f, int l, 13743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko void *mem, unsigned int size, 14743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko const char *desc); 15743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko} 16743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko 17743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko 18743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenkovoid *Thread(void *x) { 19743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko Global = 42; 20743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko WTFGlobal = 142; 21743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko return 0; 22743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko} 23743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko 24743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenkoint main() { 25743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko AnnotateBenignRaceSized(__FILE__, __LINE__, 26743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko &Global, sizeof(Global), "Race on Global"); 27743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko WTFAnnotateBenignRaceSized(__FILE__, __LINE__, 28743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko &WTFGlobal, sizeof(WTFGlobal), 29743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko "Race on WTFGlobal"); 30743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko pthread_t t; 31743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko pthread_create(&t, 0, Thread, 0); 32743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko sleep(1); 33743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko Global = 43; 34743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko WTFGlobal = 143; 35743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko pthread_join(t, 0); 36743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko printf("OK\n"); 37743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko} 38743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko 39743d89d5de3b1b6964ffb11cd26e358010c31807Alexander Potapenko// CHECK-NOT: WARNING: ThreadSanitizer: data race 40