diff options
-rw-r--r-- | crates/ra_analysis/src/db.rs | 14 | ||||
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 12 | ||||
-rw-r--r-- | crates/ra_analysis/src/lib.rs | 6 | ||||
-rw-r--r-- | crates/ra_analysis/src/roots.rs | 24 |
4 files changed, 37 insertions, 19 deletions
diff --git a/crates/ra_analysis/src/db.rs b/crates/ra_analysis/src/db.rs index 0773edcc1..c69577233 100644 --- a/crates/ra_analysis/src/db.rs +++ b/crates/ra_analysis/src/db.rs | |||
@@ -30,6 +30,20 @@ impl salsa::Database for RootDatabase { | |||
30 | } | 30 | } |
31 | } | 31 | } |
32 | 32 | ||
33 | impl salsa::ParallelDatabase for RootDatabase { | ||
34 | fn fork(&self) -> Self { | ||
35 | RootDatabase { | ||
36 | runtime: self.runtime.fork(), | ||
37 | } | ||
38 | } | ||
39 | } | ||
40 | |||
41 | impl Clone for RootDatabase { | ||
42 | fn clone(&self) -> RootDatabase { | ||
43 | salsa::ParallelDatabase::fork(self) | ||
44 | } | ||
45 | } | ||
46 | |||
33 | salsa::database_storage! { | 47 | salsa::database_storage! { |
34 | pub(crate) struct RootDatabaseStorage for RootDatabase { | 48 | pub(crate) struct RootDatabaseStorage for RootDatabase { |
35 | impl FilesDatabase { | 49 | impl FilesDatabase { |
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 0cf6db40d..d07d797d5 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs | |||
@@ -78,13 +78,13 @@ impl Default for FileResolverImp { | |||
78 | 78 | ||
79 | #[derive(Debug)] | 79 | #[derive(Debug)] |
80 | pub(crate) struct AnalysisHostImpl { | 80 | pub(crate) struct AnalysisHostImpl { |
81 | data: Arc<WorldData> | 81 | data: WorldData |
82 | } | 82 | } |
83 | 83 | ||
84 | impl AnalysisHostImpl { | 84 | impl AnalysisHostImpl { |
85 | pub fn new() -> AnalysisHostImpl { | 85 | pub fn new() -> AnalysisHostImpl { |
86 | AnalysisHostImpl { | 86 | AnalysisHostImpl { |
87 | data: Arc::new(WorldData::default()), | 87 | data: WorldData::default(), |
88 | } | 88 | } |
89 | } | 89 | } |
90 | pub fn analysis(&self) -> AnalysisImpl { | 90 | pub fn analysis(&self) -> AnalysisImpl { |
@@ -114,18 +114,18 @@ impl AnalysisHostImpl { | |||
114 | self.data_mut().libs.push(Arc::new(root)); | 114 | self.data_mut().libs.push(Arc::new(root)); |
115 | } | 115 | } |
116 | fn data_mut(&mut self) -> &mut WorldData { | 116 | fn data_mut(&mut self) -> &mut WorldData { |
117 | Arc::make_mut(&mut self.data) | 117 | &mut self.data |
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
121 | pub(crate) struct AnalysisImpl { | 121 | pub(crate) struct AnalysisImpl { |
122 | needs_reindex: AtomicBool, | 122 | needs_reindex: AtomicBool, |
123 | data: Arc<WorldData>, | 123 | data: WorldData, |
124 | } | 124 | } |
125 | 125 | ||
126 | impl fmt::Debug for AnalysisImpl { | 126 | impl fmt::Debug for AnalysisImpl { |
127 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 127 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
128 | (&*self.data).fmt(f) | 128 | self.data.fmt(f) |
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 | ||
@@ -133,7 +133,7 @@ impl Clone for AnalysisImpl { | |||
133 | fn clone(&self) -> AnalysisImpl { | 133 | fn clone(&self) -> AnalysisImpl { |
134 | AnalysisImpl { | 134 | AnalysisImpl { |
135 | needs_reindex: AtomicBool::new(self.needs_reindex.load(SeqCst)), | 135 | needs_reindex: AtomicBool::new(self.needs_reindex.load(SeqCst)), |
136 | data: Arc::clone(&self.data), | 136 | data: self.data.clone(), |
137 | } | 137 | } |
138 | } | 138 | } |
139 | } | 139 | } |
diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index d49132513..c76e4f4fe 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs | |||
@@ -258,3 +258,9 @@ impl LibraryData { | |||
258 | LibraryData { root } | 258 | LibraryData { root } |
259 | } | 259 | } |
260 | } | 260 | } |
261 | |||
262 | #[test] | ||
263 | fn analysis_is_send() { | ||
264 | fn is_send<T: Send>() {} | ||
265 | is_send::<Analysis>(); | ||
266 | } | ||
diff --git a/crates/ra_analysis/src/roots.rs b/crates/ra_analysis/src/roots.rs index 42833af36..76bcecd38 100644 --- a/crates/ra_analysis/src/roots.rs +++ b/crates/ra_analysis/src/roots.rs | |||
@@ -2,7 +2,6 @@ use std::{ | |||
2 | sync::Arc, | 2 | sync::Arc, |
3 | panic, | 3 | panic, |
4 | }; | 4 | }; |
5 | use parking_lot::RwLock; | ||
6 | 5 | ||
7 | use once_cell::sync::OnceCell; | 6 | use once_cell::sync::OnceCell; |
8 | use rayon::prelude::*; | 7 | use rayon::prelude::*; |
@@ -30,7 +29,7 @@ pub(crate) trait SourceRoot { | |||
30 | 29 | ||
31 | #[derive(Default, Debug, Clone)] | 30 | #[derive(Default, Debug, Clone)] |
32 | pub(crate) struct WritableSourceRoot { | 31 | pub(crate) struct WritableSourceRoot { |
33 | db: Arc<RwLock<db::RootDatabase>>, | 32 | db: db::RootDatabase, |
34 | } | 33 | } |
35 | 34 | ||
36 | impl WritableSourceRoot { | 35 | impl WritableSourceRoot { |
@@ -39,7 +38,6 @@ impl WritableSourceRoot { | |||
39 | changes: &mut dyn Iterator<Item=(FileId, Option<String>)>, | 38 | changes: &mut dyn Iterator<Item=(FileId, Option<String>)>, |
40 | file_resolver: Option<FileResolverImp>, | 39 | file_resolver: Option<FileResolverImp>, |
41 | ) { | 40 | ) { |
42 | let db = self.db.write(); | ||
43 | let mut changed = FxHashSet::default(); | 41 | let mut changed = FxHashSet::default(); |
44 | let mut removed = FxHashSet::default(); | 42 | let mut removed = FxHashSet::default(); |
45 | for (file_id, text) in changes { | 43 | for (file_id, text) in changes { |
@@ -48,13 +46,13 @@ impl WritableSourceRoot { | |||
48 | removed.insert(file_id); | 46 | removed.insert(file_id); |
49 | } | 47 | } |
50 | Some(text) => { | 48 | Some(text) => { |
51 | db.query(db::FileTextQuery) | 49 | self.db.query(db::FileTextQuery) |
52 | .set(file_id, Arc::new(text)); | 50 | .set(file_id, Arc::new(text)); |
53 | changed.insert(file_id); | 51 | changed.insert(file_id); |
54 | } | 52 | } |
55 | } | 53 | } |
56 | } | 54 | } |
57 | let file_set = db.file_set(()); | 55 | let file_set = self.db.file_set(()); |
58 | let mut files: FxHashSet<FileId> = file_set | 56 | let mut files: FxHashSet<FileId> = file_set |
59 | .files | 57 | .files |
60 | .clone(); | 58 | .clone(); |
@@ -63,28 +61,28 @@ impl WritableSourceRoot { | |||
63 | } | 61 | } |
64 | files.extend(changed); | 62 | files.extend(changed); |
65 | let resolver = file_resolver.unwrap_or_else(|| file_set.resolver.clone()); | 63 | let resolver = file_resolver.unwrap_or_else(|| file_set.resolver.clone()); |
66 | db.query(db::FileSetQuery) | 64 | self.db.query(db::FileSetQuery) |
67 | .set((), Arc::new(db::FileSet { files, resolver })); | 65 | .set((), Arc::new(db::FileSet { files, resolver })); |
68 | } | 66 | } |
69 | } | 67 | } |
70 | 68 | ||
71 | impl SourceRoot for WritableSourceRoot { | 69 | impl SourceRoot for WritableSourceRoot { |
72 | fn module_tree(&self) -> Arc<ModuleTreeDescriptor> { | 70 | fn module_tree(&self) -> Arc<ModuleTreeDescriptor> { |
73 | self.db.read().module_tree(()) | 71 | self.db.module_tree(()) |
74 | } | 72 | } |
75 | fn contains(&self, file_id: FileId) -> bool { | 73 | fn contains(&self, file_id: FileId) -> bool { |
76 | let db = self.db.read(); | 74 | self.db.file_set(()) |
77 | let files = &db.file_set(()).files; | 75 | .files |
78 | files.contains(&file_id) | 76 | .contains(&file_id) |
79 | } | 77 | } |
80 | fn lines(&self, file_id: FileId) -> Arc<LineIndex> { | 78 | fn lines(&self, file_id: FileId) -> Arc<LineIndex> { |
81 | self.db.read().file_lines(file_id) | 79 | self.db.file_lines(file_id) |
82 | } | 80 | } |
83 | fn syntax(&self, file_id: FileId) -> File { | 81 | fn syntax(&self, file_id: FileId) -> File { |
84 | self.db.read().file_syntax(file_id) | 82 | self.db.file_syntax(file_id) |
85 | } | 83 | } |
86 | fn symbols<'a>(&'a self, acc: &mut Vec<Arc<SymbolIndex>>) { | 84 | fn symbols<'a>(&'a self, acc: &mut Vec<Arc<SymbolIndex>>) { |
87 | let db = self.db.read(); | 85 | let db = &self.db; |
88 | let symbols = db.file_set(()); | 86 | let symbols = db.file_set(()); |
89 | let symbols = symbols | 87 | let symbols = symbols |
90 | .files | 88 | .files |