brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · efe90b6 Raw
57 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t2// RUN: %run %t 2>&1 | FileCheck %s3// RUN: %run %t arg 2>&1 | FileCheck %s4#include "java.h"5 6jptr varaddr1_old;7jptr varaddr2_old;8jptr varaddr1_new;9jptr varaddr2_new;10 11void *Thread(void *p) {12  barrier_wait(&barrier);13  *(int*)varaddr1_new = 43;14  *(int*)varaddr2_new = 43;15  return 0;16}17 18int main(int argc, char **argv) {19  barrier_init(&barrier, 2);20  int const kHeapSize = 1024 * 1024;21  void *jheap = malloc(kHeapSize);22  jheap = (char*)jheap + 8;23  __tsan_java_init((jptr)jheap, kHeapSize);24  const int kBlockSize = 64;25  int const kMove = 32;26  varaddr1_old = (jptr)jheap;27  varaddr2_old = (jptr)jheap + kBlockSize - 1;28  varaddr1_new = varaddr1_old + kMove;29  varaddr2_new = varaddr2_old + kMove;30  if (argc > 1) {31    // Move memory backwards.32    varaddr1_old += kMove;33    varaddr2_old += kMove;34    varaddr1_new -= kMove;35    varaddr2_new -= kMove;36  }37  __tsan_java_alloc(varaddr1_old, kBlockSize);38 39  pthread_t th;40  pthread_create(&th, 0, Thread, 0);41 42  *(int*)varaddr1_old = 43;43  *(int*)varaddr2_old = 43;44 45  __tsan_java_move(varaddr1_old, varaddr1_new, kBlockSize);46  barrier_wait(&barrier);47  pthread_join(th, 0);48  __tsan_java_free(varaddr1_new, kBlockSize);49  fprintf(stderr, "DONE\n");50  return __tsan_java_fini();51}52 53// Note: there is a race on the moved object (which we used to detect),54// but now __tsan_java_move resets the object shadow, so we don't detect it anymore.55// CHECK-NOT: WARNING: ThreadSanitizer: data race56// CHECK: DONE57