aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-06-01 08:57:44 +0100
committerAleksey Kladov <[email protected]>2019-06-01 08:57:44 +0100
commitf89d34be6a93263d7fa506bba6da1d1d7de237bc (patch)
tree4a631d74872b41bb2f8325962d7041f5b1055f92 /crates
parent5023860a55328db5ef024225263ed71f46a19350 (diff)
don't poison mutex around chalk
We use panics for cancellation, so we could trigger panic while holding the solver. std::sync::Mutex will be poisoned as a result, which and all further attempts to use solver (from other threads) will panic as well. This commit switches to parking_lot::Mutex which just unlocks on panic.
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_hir/src/db.rs3
-rw-r--r--crates/ra_hir/src/ty/traits.rs5
2 files changed, 5 insertions, 3 deletions
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index 11cdf9c34..d84e1598b 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -1,5 +1,6 @@
1use std::sync::{Arc, Mutex}; 1use std::sync::Arc;
2 2
3use parking_lot::Mutex;
3use ra_syntax::{SyntaxNode, TreeArc, SmolStr, ast}; 4use ra_syntax::{SyntaxNode, TreeArc, SmolStr, ast};
4use ra_db::{SourceDatabase, salsa}; 5use ra_db::{SourceDatabase, salsa};
5 6
diff --git a/crates/ra_hir/src/ty/traits.rs b/crates/ra_hir/src/ty/traits.rs
index fc90f56d5..db78f25ca 100644
--- a/crates/ra_hir/src/ty/traits.rs
+++ b/crates/ra_hir/src/ty/traits.rs
@@ -1,6 +1,7 @@
1//! Trait solving using Chalk. 1//! Trait solving using Chalk.
2use std::sync::{Arc, Mutex}; 2use std::sync::Arc;
3 3
4use parking_lot::Mutex;
4use rustc_hash::FxHashSet; 5use rustc_hash::FxHashSet;
5use log::debug; 6use log::debug;
6use chalk_ir::cast::Cast; 7use chalk_ir::cast::Cast;
@@ -61,7 +62,7 @@ fn solve(
61 let context = ChalkContext { db, krate }; 62 let context = ChalkContext { db, krate };
62 let solver = db.solver(krate); 63 let solver = db.solver(krate);
63 debug!("solve goal: {:?}", goal); 64 debug!("solve goal: {:?}", goal);
64 let solution = solver.lock().unwrap().solve_with_fuel(&context, goal, Some(1000)); 65 let solution = solver.lock().solve_with_fuel(&context, goal, Some(1000));
65 debug!("solve({:?}) => {:?}", goal, solution); 66 debug!("solve({:?}) => {:?}", goal, solution);
66 solution 67 solution
67} 68}