summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_deadlock_detector.h
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2014-03-19 13:53:37 +0000
committerKostya Serebryany <kcc@google.com>2014-03-19 13:53:37 +0000
commit75ac702b0cde5be4497a023b3d86de9cb1f859b2 (patch)
treea4ce24571a1d35b3b3bba932065a1cd09b90d88d /lib/sanitizer_common/sanitizer_deadlock_detector.h
parentaf3a2afe05edae65ac5f98f83bd10d5bbb97be88 (diff)
[sanitizer] when recycling deadlock graph nodes, properly recycle edges
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@204233 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_deadlock_detector.h')
-rw-r--r--lib/sanitizer_common/sanitizer_deadlock_detector.h12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/sanitizer_common/sanitizer_deadlock_detector.h b/lib/sanitizer_common/sanitizer_deadlock_detector.h
index 637153c90..965bd8042 100644
--- a/lib/sanitizer_common/sanitizer_deadlock_detector.h
+++ b/lib/sanitizer_common/sanitizer_deadlock_detector.h
@@ -153,6 +153,14 @@ class DeadlockDetector {
if (!available_nodes_.empty())
return getAvailableNode(data);
if (!recycled_nodes_.empty()) {
+ // Printf("recycling: n_edges_ %zd\n", n_edges_);
+ for (sptr i = n_edges_ - 1; i >= 0; i--) {
+ if (recycled_nodes_.getBit(edges_[i].from) ||
+ recycled_nodes_.getBit(edges_[i].to)) {
+ Swap(edges_[i], edges_[n_edges_ - 1]);
+ n_edges_--;
+ }
+ }
CHECK(available_nodes_.empty());
// removeEdgesFrom was called in removeNode.
g_.removeEdgesTo(recycled_nodes_);
@@ -233,7 +241,7 @@ class DeadlockDetector {
if (n_edges_ < ARRAY_SIZE(edges_))
edges_[n_edges_++] = Edge((u16)added_edges[i], (u16)cur_idx,
dtls->findLockContext(added_edges[i]), stk);
- // Printf("Edge [%zd]: %u %zd=>%zd\n", i, stk, added_edges[i], cur_idx);
+ // Printf("E%zd: %u %zd=>%zd\n", n_edges_, stk, added_edges[i], cur_idx);
}
return n_added_edges;
}
@@ -256,7 +264,7 @@ class DeadlockDetector {
bool onLock(DeadlockDetectorTLS<BV> *dtls, uptr cur_node, u32 stk = 0) {
ensureCurrentEpoch(dtls);
bool is_reachable = !isHeld(dtls, cur_node) && onLockBefore(dtls, cur_node);
- addEdges(dtls, cur_node, 0);
+ addEdges(dtls, cur_node, stk);
onLockAfter(dtls, cur_node, stk);
return is_reachable;
}