mirror of
https://github.com/bertptrs/tracing-mutex.git
synced 2025-12-25 20:50:32 +01:00
Fix a graph invariant violation on cycle detection
This commit is contained in:
@@ -11,6 +11,9 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|||||||
type aliases function the same as the ones they belong to, resolving to either the tracing
|
type aliases function the same as the ones they belong to, resolving to either the tracing
|
||||||
versions when debug assertions are enabled or the standard one when they're not.
|
versions when debug assertions are enabled or the standard one when they're not.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fixed a corruption error where deallocating a previously cyclic mutex could result in a panic.
|
||||||
|
|
||||||
## [0.1.1] - 2021-05-24
|
## [0.1.1] - 2021-05-24
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ where
|
|||||||
// We use map instead of unwrap to avoid an `unwrap()` but we know that these
|
// We use map instead of unwrap to avoid an `unwrap()` but we know that these
|
||||||
// entries are present as we just added them above.
|
// entries are present as we just added them above.
|
||||||
self.nodes.get_mut(&y).map(|node| node.in_edges.remove(&x));
|
self.nodes.get_mut(&y).map(|node| node.in_edges.remove(&x));
|
||||||
self.nodes.get_mut(&x).map(|node| node.out_edges.remove(&x));
|
self.nodes.get_mut(&x).map(|node| node.out_edges.remove(&y));
|
||||||
|
|
||||||
// No edge was added
|
// No edge was added
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
12
src/lib.rs
12
src/lib.rs
@@ -304,6 +304,18 @@ mod tests {
|
|||||||
assert!(get_dependency_graph().add_edge(c.value(), a.value()));
|
assert!(get_dependency_graph().add_edge(c.value(), a.value()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Test creating a cycle, then panicking.
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_mutex_id_conflict() {
|
||||||
|
let ids = [MutexId::new(), MutexId::new(), MutexId::new()];
|
||||||
|
|
||||||
|
for i in 0..3 {
|
||||||
|
let _first_lock = ids[i].get_borrowed();
|
||||||
|
let _second_lock = ids[(i + 1) % 3].get_borrowed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Fuzz the global dependency graph by fake-acquiring lots of mutexes in a valid order.
|
/// Fuzz the global dependency graph by fake-acquiring lots of mutexes in a valid order.
|
||||||
///
|
///
|
||||||
/// This test generates all possible forward edges in a 100-node graph consisting of natural
|
/// This test generates all possible forward edges in a 100-node graph consisting of natural
|
||||||
|
|||||||
Reference in New Issue
Block a user