| // RUN: %clangxx_tsan -O0 %s -o %t | 
 | // RUN: not %run %t          2>&1 | FileCheck %s --check-prefix=CHECK-RACE | 
 | // Test size larger than clear_shadow_mmap_threshold, which is handled differently. | 
 | // RUN: not %run %t - 262144 2>&1 | FileCheck %s --check-prefix=CHECK-RACE | 
 | // RUN:     %run %t ignore   2>&1 | FileCheck %s --check-prefix=CHECK-IGNORE | 
 |  | 
 | #include <sys/mman.h> | 
 | #include <string.h> | 
 | #include <assert.h> | 
 | #include <atomic> | 
 |  | 
 | #include "test.h" | 
 |  | 
 | // Use atomic to ensure we do not have a race for the pointer value itself.  We | 
 | // only want to check races in the mmap'd memory to isolate the test that mmap | 
 | // respects ignore annotations. | 
 | std::atomic<int*> global_p; | 
 |  | 
 | void mmap_ignored(bool ignore, size_t size) { | 
 |   if (ignore) AnnotateIgnoreWritesBegin(__FILE__, __LINE__); | 
 |   void *p = | 
 |       mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); | 
 |   if (ignore) AnnotateIgnoreWritesEnd(__FILE__, __LINE__); | 
 |  | 
 |   // Use relaxed to retain the race between the mmap call and the memory write | 
 |   global_p.store((int *)p, std::memory_order_relaxed); | 
 |   barrier_wait(&barrier); | 
 | } | 
 |  | 
 | void *WriteToMemory(void *unused) { | 
 |   barrier_wait(&barrier); | 
 |   global_p[0] = 7; | 
 |   return 0; | 
 | } | 
 |  | 
 | // Create race between allocating (mmap) and writing memory | 
 | int main(int argc, const char *argv[]) { | 
 |   bool ignore = (argc > 1) && (strcmp(argv[1], "ignore") == 0); | 
 |   size_t size = argc > 2 ? atoi(argv[2]) : sysconf(_SC_PAGESIZE); | 
 |  | 
 |   barrier_init(&barrier, 2); | 
 |   pthread_t t; | 
 |   pthread_create(&t, 0, WriteToMemory, 0); | 
 |   mmap_ignored(ignore, size); | 
 |   pthread_join(t, 0); | 
 |  | 
 |   assert(global_p[0] == 7); | 
 |   printf("OK\n"); | 
 |   return 0; | 
 | } | 
 |  | 
 | // CHECK-RACE: WARNING: ThreadSanitizer: data race | 
 | // CHECK-RACE: OK | 
 | // CHECK-IGNORE-NOT: WARNING: ThreadSanitizer: data race | 
 | // CHECK-IGNORE: OK |