@@ -56,14 +56,15 @@ pub fn parallel_prime_caches(
56
56
57
57
let ( reverse_deps, mut to_be_done_deps) = {
58
58
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 < _ , _ > > ( ) ;
59
63
let mut reverse_deps =
60
64
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 < _ , _ > > ( ) ;
63
65
for & krate in & * all_crates {
64
66
for dep in & krate. data ( db) . dependencies {
65
67
reverse_deps. get_mut ( & dep. crate_id ) . unwrap ( ) . push ( krate) ;
66
- * to_be_done_deps. get_mut ( & krate) . unwrap ( ) += 1 ;
67
68
}
68
69
}
69
70
( reverse_deps, to_be_done_deps)
@@ -74,72 +75,72 @@ pub fn parallel_prime_caches(
74
75
let ( def_map_work_sender, def_map_work_receiver) = crossbeam_channel:: unbounded ( ) ;
75
76
let ( import_map_work_sender, import_map_work_receiver) = crossbeam_channel:: unbounded ( ) ;
76
77
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
+ } ) ?;
83
85
84
- let cancelled = Cancelled :: catch ( || _ = hir:: crate_def_map ( & db, crate_id) ) ;
86
+ let cancelled = Cancelled :: catch ( || _ = hir:: crate_def_map ( & db, crate_id) ) ;
85
87
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
+ }
92
94
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) ) ;
97
99
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) ) ?,
101
105
}
102
- Err ( cancelled) => progress_sender
103
- . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
104
- }
105
106
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) ) ) ;
111
112
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) ) ?,
115
118
}
116
- Err ( cancelled) => progress_sender
117
- . send ( ParallelPrimeCacheWorkerProgress :: Cancelled ( cancelled) ) ?,
118
- }
119
119
120
- Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
121
- } ;
120
+ Ok :: < _ , crossbeam_channel:: SendError < _ > > ( ( ) )
121
+ } ;
122
122
123
- loop {
124
- db. unwind_if_revision_cancelled ( ) ;
123
+ loop {
124
+ db. unwind_if_revision_cancelled ( ) ;
125
125
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
+ }
139
140
}
140
141
}
141
- }
142
- } ;
142
+ Ok :: < _ , crossbeam_channel :: SendError < _ > > ( ( ) )
143
+ } ;
143
144
144
145
for id in 0 ..num_worker_threads {
145
146
stdx:: thread:: Builder :: new (
0 commit comments