java_lock_move.cc revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
1// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2#include "java.h" 3 4jptr varaddr; 5jptr lockaddr; 6jptr varaddr2; 7jptr lockaddr2; 8 9void *Thread(void *p) { 10 sleep(1); 11 __tsan_java_mutex_lock(lockaddr2); 12 *(int*)varaddr2 = 42; 13 __tsan_java_mutex_unlock(lockaddr2); 14 return 0; 15} 16 17int main() { 18 int const kHeapSize = 1024 * 1024; 19 void *jheap = malloc(kHeapSize); 20 __tsan_java_init((jptr)jheap, kHeapSize); 21 const int kBlockSize = 64; 22 int const kMove = 1024; 23 __tsan_java_alloc((jptr)jheap, kBlockSize); 24 varaddr = (jptr)jheap; 25 lockaddr = (jptr)jheap + 46; 26 varaddr2 = varaddr + kMove; 27 lockaddr2 = lockaddr + kMove; 28 pthread_t th; 29 pthread_create(&th, 0, Thread, 0); 30 __tsan_java_mutex_lock(lockaddr); 31 *(int*)varaddr = 43; 32 __tsan_java_mutex_unlock(lockaddr); 33 __tsan_java_move(varaddr, varaddr2, kBlockSize); 34 pthread_join(th, 0); 35 __tsan_java_free(varaddr2, kBlockSize); 36 printf("OK\n"); 37 return __tsan_java_fini(); 38} 39 40// CHECK-NOT: WARNING: ThreadSanitizer: data race 41