diff options
author | Kostya Serebryany <kcc@google.com> | 2014-03-31 07:23:50 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2014-03-31 07:23:50 +0000 |
commit | 6239ca0fb2741276c55e3eac783e24108cc4f71e (patch) | |
tree | e636cd53fd80e19591338c9eeb6e3643a06f06e8 /lib/sanitizer_common/sanitizer_deadlock_detector.h | |
parent | 128891cfae56bed0c169b3e9c98c824c574ea414 (diff) |
[sanitizer] speed up the bitvector-based deadlock detector by ~15% (iterate over the currently held locks using the array, not the bitvector. Bitvector is not the best data structure to iterate over)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@205168 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_deadlock_detector.h')
-rw-r--r-- | lib/sanitizer_common/sanitizer_deadlock_detector.h | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/sanitizer_common/sanitizer_deadlock_detector.h b/lib/sanitizer_common/sanitizer_deadlock_detector.h index a0a03ccbb..e0beb1261 100644 --- a/lib/sanitizer_common/sanitizer_deadlock_detector.h +++ b/lib/sanitizer_common/sanitizer_deadlock_detector.h @@ -64,12 +64,10 @@ class DeadlockDetectorTLS { recursive_locks[n_recursive_locks++] = lock_id; return false; } - if (stk) { - CHECK_LT(n_all_locks_, ARRAY_SIZE(all_locks_with_contexts_)); - // lock_id < BV::kSize, can cast to a smaller int. - u32 lock_id_short = static_cast<u32>(lock_id); - all_locks_with_contexts_[n_all_locks_++] = {lock_id_short, stk}; - } + CHECK_LT(n_all_locks_, ARRAY_SIZE(all_locks_with_contexts_)); + // lock_id < BV::kSize, can cast to a smaller int. + u32 lock_id_short = static_cast<u32>(lock_id); + all_locks_with_contexts_[n_all_locks_++] = {lock_id_short, stk}; return true; } @@ -109,6 +107,9 @@ class DeadlockDetectorTLS { return bv_; } + uptr getNumLocks() const { return n_all_locks_; } + uptr getLock(uptr idx) const { return all_locks_with_contexts_[idx].lock; } + private: BV bv_; uptr epoch_; @@ -222,7 +223,11 @@ class DeadlockDetector { if (cur_node && local_epoch == current_epoch_ && local_epoch == nodeToEpoch(cur_node)) { uptr cur_idx = nodeToIndexUnchecked(cur_node); - return g_.hasAllEdges(dtls->getLocks(local_epoch), cur_idx); + for (uptr i = 0, n = dtls->getNumLocks(); i < n; i++) { + if (!g_.hasEdge(dtls->getLock(i), cur_idx)) + return false; + } + return true; } return false; } |