@@ -56,14 +56,15 @@ pub fn parallel_prime_caches(
5656
5757 let ( reverse_deps, mut to_be_done_deps) = {
5858 let all_crates = db. all_crates ( ) ;
59+ let to_be_done_deps = all_crates
60+ . iter ( )
61+ . map ( |& krate| ( krate, krate. data ( db) . dependencies . len ( ) as u32 ) )
62+ . collect :: < FxHashMap < _ , _ > > ( ) ;
5963 let mut reverse_deps =
6064 all_crates. iter ( ) . map ( |& krate| ( krate, Vec :: new ( ) ) ) . collect :: < FxHashMap < _ , _ > > ( ) ;
61- let mut to_be_done_deps =
62- all_crates. iter ( ) . map ( |& krate| ( krate, 0u32 ) ) . collect :: < FxHashMap < _ , _ > > ( ) ;
6365 for & krate in & * all_crates {
6466 for dep in & krate. data ( db) . dependencies {
6567 reverse_deps. get_mut ( & dep. crate_id ) . unwrap ( ) . push ( krate) ;
66- * to_be_done_deps. get_mut ( & krate) . unwrap ( ) += 1 ;
6768 }
6869 }
6970 ( reverse_deps, to_be_done_deps)
@@ -74,72 +75,72 @@ pub fn parallel_prime_caches(
7475 let ( def_map_work_sender, def_map_work_receiver) = crossbeam_channel:: unbounded ( ) ;
7576 let ( import_map_work_sender, import_map_work_receiver) = crossbeam_channel:: unbounded ( ) ;
7677 let ( symbols_work_sender, symbols_work_receiver) = crossbeam_channel:: unbounded ( ) ;
77- let prime_caches_worker = move |db : RootDatabase | {
78- let handle_def_map = |crate_id, crate_name| {
79- progress_sender. send ( ParallelPrimeCacheWorkerProgress :: BeginCrateDefMap {
80- crate_id,
81- crate_name,
82- } ) ?;
78+ let prime_caches_worker =
79+ move |db : RootDatabase | {
80+ let handle_def_map = |crate_id, crate_name| {
81+ progress_sender. send ( ParallelPrimeCacheWorkerProgress :: BeginCrateDefMap {
82+ crate_id,
83+ crate_name,
84+ } ) ?;
8385
84- let cancelled = Cancelled :: catch ( || _ = hir:: crate_def_map ( & db, crate_id) ) ;
86+ let cancelled = Cancelled :: catch ( || _ = hir:: crate_def_map ( & db, crate_id) ) ;
8587
86- match cancelled {
87- Ok ( ( ) ) => progress_sender
88- . send ( ParallelPrimeCacheWorkerProgress :: EndCrateDefMap { crate_id } ) ?,
89- Err ( cancelled) => progress_sender
90- . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
91- }
88+ match cancelled {
89+ Ok ( ( ) ) => progress_sender
90+ . send ( ParallelPrimeCacheWorkerProgress :: EndCrateDefMap { crate_id } ) ?,
91+ Err ( cancelled) => progress_sender
92+ . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
93+ }
9294
93- Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
94- } ;
95- let handle_import_map = |crate_id| {
96- let cancelled = Cancelled :: catch ( || _ = db. import_map ( crate_id) ) ;
95+ Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
96+ } ;
97+ let handle_import_map = |crate_id| {
98+ let cancelled = Cancelled :: catch ( || _ = db. import_map ( crate_id) ) ;
9799
98- match cancelled {
99- Ok ( ( ) ) => {
100- progress_sender. send ( ParallelPrimeCacheWorkerProgress :: EndCrateImportMap ) ?
100+ match cancelled {
101+ Ok ( ( ) ) => progress_sender
102+ . send ( ParallelPrimeCacheWorkerProgress :: EndCrateImportMap ) ?,
103+ Err ( cancelled) => progress_sender
104+ . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
101105 }
102- Err ( cancelled) => progress_sender
103- . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
104- }
105106
106- Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
107- } ;
108- let handle_symbols = |module| {
109- let cancelled =
110- Cancelled :: catch ( AssertUnwindSafe ( || _ = db. module_symbols ( module) ) ) ;
107+ Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
108+ } ;
109+ let handle_symbols = |module| {
110+ let cancelled =
111+ Cancelled :: catch ( AssertUnwindSafe ( || _ = db. module_symbols ( module) ) ) ;
111112
112- match cancelled {
113- Ok ( ( ) ) => {
114- progress_sender. send ( ParallelPrimeCacheWorkerProgress :: EndModuleSymbols ) ?
113+ match cancelled {
114+ Ok ( ( ) ) => progress_sender
115+ . send ( ParallelPrimeCacheWorkerProgress :: EndModuleSymbols ) ?,
116+ Err ( cancelled) => progress_sender
117+ . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
115118 }
116- Err ( cancelled) => progress_sender
117- . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
118- }
119119
120- Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
121- } ;
120+ Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
121+ } ;
122122
123- loop {
124- db. unwind_if_revision_cancelled ( ) ;
123+ loop {
124+ db. unwind_if_revision_cancelled ( ) ;
125125
126- // Biased because we want to prefer def maps.
127- crossbeam_channel:: select_biased! {
128- recv( def_map_work_receiver) -> work => {
129- let Ok ( ( crate_id, crate_name) ) = work else { return Ok :: <_, crossbeam_channel:: SendError <_>>( ( ) ) } ;
130- handle_def_map( crate_id, crate_name) ?;
131- }
132- recv( import_map_work_receiver) -> work => {
133- let Ok ( crate_id) = work else { return Ok ( ( ) ) } ;
134- handle_import_map( crate_id) ?;
135- }
136- recv( symbols_work_receiver) -> work => {
137- let Ok ( module) = work else { return Ok ( ( ) ) } ;
138- handle_symbols( module) ?;
126+ // Biased because we want to prefer def maps.
127+ crossbeam_channel:: select_biased! {
128+ recv( def_map_work_receiver) -> work => {
129+ let Ok ( ( crate_id, crate_name) ) = work else { break } ;
130+ handle_def_map( crate_id, crate_name) ?;
131+ }
132+ recv( import_map_work_receiver) -> work => {
133+ let Ok ( crate_id) = work else { break } ;
134+ handle_import_map( crate_id) ?;
135+ }
136+ recv( symbols_work_receiver) -> work => {
137+ let Ok ( module) = work else { break } ;
138+ handle_symbols( module) ?;
139+ }
139140 }
140141 }
141- }
142- } ;
142+ Ok :: < _ , crossbeam_channel :: SendError < _ > > ( ( ) )
143+ } ;
143144
144145 for id in 0 ..num_worker_threads {
145146 stdx:: thread:: Builder :: new (
0 commit comments