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