diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2012-12-20 17:29:34 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2012-12-20 17:29:34 +0000 |
commit | 21cc85db95b8fa85a9ff7a403c8a24e345d73baf (patch) | |
tree | 4af283fc04c5acad54e5c4c7187a4eb8c175792f /lib/tsan/rtl/tsan_sync.cc | |
parent | e01f96be0daecec81f41b46377508885d83bb584 (diff) |
tsan: java interface implementation skeleton
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@170707 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_sync.cc')
-rw-r--r-- | lib/tsan/rtl/tsan_sync.cc | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/lib/tsan/rtl/tsan_sync.cc b/lib/tsan/rtl/tsan_sync.cc index 895132546..b25346ef3 100644 --- a/lib/tsan/rtl/tsan_sync.cc +++ b/lib/tsan/rtl/tsan_sync.cc @@ -57,9 +57,26 @@ SyncVar* SyncTab::GetIfExistsAndLock(uptr addr, bool write_lock) { return GetAndLock(0, 0, addr, write_lock, false); } +SyncVar* SyncTab::Create(ThreadState *thr, uptr pc, uptr addr) { + StatInc(thr, StatSyncCreated); + void *mem = internal_alloc(MBlockSync, sizeof(SyncVar)); + const u64 uid = atomic_fetch_add(&uid_gen_, 1, memory_order_relaxed); + SyncVar *res = new(mem) SyncVar(addr, uid); +#ifndef TSAN_GO + res->creation_stack.ObtainCurrent(thr, pc); +#endif + return res; +} + SyncVar* SyncTab::GetAndLock(ThreadState *thr, uptr pc, uptr addr, bool write_lock, bool create) { #ifndef TSAN_GO + { // NOLINT + SyncVar *res = GetJavaSync(thr, pc, addr, write_lock, create); + if (res) + return res; + } + // Here we ask only PrimaryAllocator, because // SecondaryAllocator::PointerIsMine() is slow and we have fallback on // the hashmap anyway. @@ -74,11 +91,7 @@ SyncVar* SyncTab::GetAndLock(ThreadState *thr, uptr pc, if (res == 0) { if (!create) return 0; - StatInc(thr, StatSyncCreated); - void *mem = internal_alloc(MBlockSync, sizeof(SyncVar)); - const u64 uid = atomic_fetch_add(&uid_gen_, 1, memory_order_relaxed); - res = new(mem) SyncVar(addr, uid); - res->creation_stack.ObtainCurrent(thr, pc); + res = Create(thr, pc, addr); res->next = b->head; b->head = res; } @@ -113,13 +126,7 @@ SyncVar* SyncTab::GetAndLock(ThreadState *thr, uptr pc, break; } if (res == 0) { - StatInc(thr, StatSyncCreated); - void *mem = internal_alloc(MBlockSync, sizeof(SyncVar)); - const u64 uid = atomic_fetch_add(&uid_gen_, 1, memory_order_relaxed); - res = new(mem) SyncVar(addr, uid); -#ifndef TSAN_GO - res->creation_stack.ObtainCurrent(thr, pc); -#endif + res = Create(thr, pc, addr); res->next = p->val; p->val = res; } @@ -133,6 +140,11 @@ SyncVar* SyncTab::GetAndLock(ThreadState *thr, uptr pc, SyncVar* SyncTab::GetAndRemove(ThreadState *thr, uptr pc, uptr addr) { #ifndef TSAN_GO + { // NOLINT + SyncVar *res = GetAndRemoveJavaSync(thr, pc, addr); + if (res) + return res; + } if (PrimaryAllocator::PointerIsMine((void*)addr)) { MBlock *b = user_mblock(thr, (void*)addr); SyncVar *res = 0; |