@@ -8,10 +8,11 @@ use crate::query::config::{QueryDescription, QueryVtable};
88use  crate :: query:: job:: { report_cycle,  QueryInfo ,  QueryJob ,  QueryJobId ,  QueryJobInfo } ; 
99use  crate :: query:: { QueryContext ,  QueryMap ,  QuerySideEffects ,  QueryStackFrame } ; 
1010use  rustc_data_structures:: fingerprint:: Fingerprint ; 
11- use  rustc_data_structures:: fx:: { FxHashMap ,   FxHasher } ; 
11+ use  rustc_data_structures:: fx:: FxHashMap ; 
1212#[ cfg( parallel_compiler) ]  
1313use  rustc_data_structures:: profiling:: TimingGuard ; 
14- use  rustc_data_structures:: sharded:: { get_shard_index_by_hash,  Sharded } ; 
14+ #[ cfg( parallel_compiler) ]  
15+ use  rustc_data_structures:: sharded:: Sharded ; 
1516use  rustc_data_structures:: sync:: Lock ; 
1617use  rustc_data_structures:: thin_vec:: ThinVec ; 
1718use  rustc_errors:: { DiagnosticBuilder ,  FatalError } ; 
@@ -20,21 +21,15 @@ use rustc_span::{Span, DUMMY_SP};
2021use  std:: cell:: Cell ; 
2122use  std:: collections:: hash_map:: Entry ; 
2223use  std:: fmt:: Debug ; 
23- use  std:: hash:: { Hash ,   Hasher } ; 
24+ use  std:: hash:: Hash ; 
2425use  std:: mem; 
2526use  std:: ptr; 
2627
27- // We compute the key's hash once and then use it for both the 
28- // shard lookup and the hashmap lookup. This relies on the fact 
29- // that both of them use `FxHasher`. 
30- fn  hash_for_shard < K :  Hash > ( key :  & K )  -> u64  { 
31-     let  mut  hasher = FxHasher :: default ( ) ; 
32-     key. hash ( & mut  hasher) ; 
33-     hasher. finish ( ) 
34- } 
35- 
3628pub  struct  QueryState < K >  { 
37-     shards :  Sharded < FxHashMap < K ,  QueryResult > > , 
29+     #[ cfg( parallel_compiler) ]  
30+     active :  Sharded < FxHashMap < K ,  QueryResult > > , 
31+     #[ cfg( not( parallel_compiler) ) ]  
32+     active :  Lock < FxHashMap < K ,  QueryResult > > , 
3833} 
3934
4035/// Indicates the state of a query for a given key in a query map. 
5247    K :  Eq  + Hash  + Clone  + Debug , 
5348{ 
5449    pub  fn  all_inactive ( & self )  -> bool  { 
55-         let  shards = self . shards . lock_shards ( ) ; 
56-         shards. iter ( ) . all ( |shard| shard. is_empty ( ) ) 
50+         #[ cfg( parallel_compiler) ]  
51+         { 
52+             let  shards = self . active . lock_shards ( ) ; 
53+             shards. iter ( ) . all ( |shard| shard. is_empty ( ) ) 
54+         } 
55+         #[ cfg( not( parallel_compiler) ) ]  
56+         { 
57+             self . active . lock ( ) . is_empty ( ) 
58+         } 
5759    } 
5860
5961    pub  fn  try_collect_active_jobs < CTX :  Copy > ( 
@@ -62,11 +64,27 @@ where
6264        make_query :  fn ( CTX ,  K )  -> QueryStackFrame , 
6365        jobs :  & mut  QueryMap , 
6466    )  -> Option < ( ) >  { 
65-         // We use try_lock_shards here since we are called from the 
66-         // deadlock handler, and this shouldn't be locked. 
67-         let  shards = self . shards . try_lock_shards ( ) ?; 
68-         for  shard in  shards. iter ( )  { 
69-             for  ( k,  v)  in  shard. iter ( )  { 
67+         #[ cfg( parallel_compiler) ]  
68+         { 
69+             // We use try_lock_shards here since we are called from the 
70+             // deadlock handler, and this shouldn't be locked. 
71+             let  shards = self . active . try_lock_shards ( ) ?; 
72+             for  shard in  shards. iter ( )  { 
73+                 for  ( k,  v)  in  shard. iter ( )  { 
74+                     if  let  QueryResult :: Started ( ref  job)  = * v { 
75+                         let  query = make_query ( tcx,  k. clone ( ) ) ; 
76+                         jobs. insert ( job. id ,  QueryJobInfo  {  query,  job :  job. clone ( )  } ) ; 
77+                     } 
78+                 } 
79+             } 
80+         } 
81+         #[ cfg( not( parallel_compiler) ) ]  
82+         { 
83+             // We use try_lock here since we are called from the 
84+             // deadlock handler, and this shouldn't be locked. 
85+             // (FIXME: Is this relevant for non-parallel compilers? It doesn't 
86+             // really hurt much.) 
87+             for  ( k,  v)  in  self . active . try_lock ( ) ?. iter ( )  { 
7088                if  let  QueryResult :: Started ( ref  job)  = * v { 
7189                    let  query = make_query ( tcx,  k. clone ( ) ) ; 
7290                    jobs. insert ( job. id ,  QueryJobInfo  {  query,  job :  job. clone ( )  } ) ; 
8098
8199impl < K >  Default  for  QueryState < K >  { 
82100    fn  default ( )  -> QueryState < K >  { 
83-         QueryState  {  shards :  Default :: default ( )  } 
101+         QueryState  {  active :  Default :: default ( )  } 
84102    } 
85103} 
86104
@@ -135,7 +153,10 @@ where
135153    where 
136154        CTX :  QueryContext , 
137155    { 
138-         let  mut  state_lock = state. shards . get_shard_by_value ( & key) . lock ( ) ; 
156+         #[ cfg( parallel_compiler) ]  
157+         let  mut  state_lock = state. active . get_shard_by_value ( & key) . lock ( ) ; 
158+         #[ cfg( not( parallel_compiler) ) ]  
159+         let  mut  state_lock = state. active . lock ( ) ; 
139160        let  lock = & mut  * state_lock; 
140161
141162        match  lock. entry ( key)  { 
@@ -206,10 +227,11 @@ where
206227        mem:: forget ( self ) ; 
207228
208229        let  ( job,  result)  = { 
209-             let  key_hash = hash_for_shard ( & key) ; 
210-             let  shard = get_shard_index_by_hash ( key_hash) ; 
211230            let  job = { 
212-                 let  mut  lock = state. shards . get_shard_by_index ( shard) . lock ( ) ; 
231+                 #[ cfg( parallel_compiler) ]  
232+                 let  mut  lock = state. active . get_shard_by_value ( & key) . lock ( ) ; 
233+                 #[ cfg( not( parallel_compiler) ) ]  
234+                 let  mut  lock = state. active . lock ( ) ; 
213235                match  lock. remove ( & key) . unwrap ( )  { 
214236                    QueryResult :: Started ( job)  => job, 
215237                    QueryResult :: Poisoned  => panic ! ( ) , 
@@ -233,9 +255,11 @@ where
233255    fn  drop ( & mut  self )  { 
234256        // Poison the query so jobs waiting on it panic. 
235257        let  state = self . state ; 
236-         let  shard = state. shards . get_shard_by_value ( & self . key ) ; 
237258        let  job = { 
238-             let  mut  shard = shard. lock ( ) ; 
259+             #[ cfg( parallel_compiler) ]  
260+             let  mut  shard = state. active . get_shard_by_value ( & self . key ) . lock ( ) ; 
261+             #[ cfg( not( parallel_compiler) ) ]  
262+             let  mut  shard = state. active . lock ( ) ; 
239263            let  job = match  shard. remove ( & self . key ) . unwrap ( )  { 
240264                QueryResult :: Started ( job)  => job, 
241265                QueryResult :: Poisoned  => panic ! ( ) , 
0 commit comments