Fix a graph invariant violation on cycle detection

This commit is contained in:
2021-05-27 20:31:00 +02:00
parent 158e5353bb
commit e2db0eaca8
3 changed files with 16 additions and 1 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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