@@ -2,7 +2,7 @@ use parking_lot::Mutex;
2
2
use rustc_data_structures:: fingerprint:: Fingerprint ;
3
3
use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
4
4
use rustc_data_structures:: profiling:: { EventId , QueryInvocationId , SelfProfilerRef } ;
5
- use rustc_data_structures:: sharded:: { self , Sharded } ;
5
+ use rustc_data_structures:: sharded:: Sharded ;
6
6
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
7
7
use rustc_data_structures:: steal:: Steal ;
8
8
use rustc_data_structures:: sync:: { AtomicU32 , AtomicU64 , Lock , Lrc , Ordering } ;
@@ -466,8 +466,42 @@ impl<K: DepKind> DepGraph<K> {
466
466
pub fn read_index ( & self , dep_node_index : DepNodeIndex ) {
467
467
if let Some ( ref data) = self . data {
468
468
K :: read_deps ( |task_deps| {
469
- let mut task_deps = match task_deps {
470
- TaskDepsRef :: Allow ( deps) => deps. lock ( ) ,
469
+ match task_deps {
470
+ TaskDepsRef :: Allow ( deps) => deps. with_lock ( |task_deps| {
471
+ // As long as we only have a low number of reads we can avoid doing a hash
472
+ // insert and potentially allocating/reallocating the hashmap
473
+ let new_read = if task_deps. reads . len ( ) < TASK_DEPS_READS_CAP {
474
+ task_deps. reads . iter ( ) . all ( |other| * other != dep_node_index)
475
+ } else {
476
+ task_deps. read_set . insert ( dep_node_index)
477
+ } ;
478
+ if new_read {
479
+ task_deps. reads . push ( dep_node_index) ;
480
+ if task_deps. reads . len ( ) == TASK_DEPS_READS_CAP {
481
+ // Fill `read_set` with what we have so far so we can use the hashset
482
+ // next time
483
+ task_deps. read_set . extend ( task_deps. reads . iter ( ) . copied ( ) ) ;
484
+ }
485
+
486
+ #[ cfg( debug_assertions) ]
487
+ {
488
+ if let Some ( target) = task_deps. node {
489
+ if let Some ( ref forbidden_edge) = data. current . forbidden_edge {
490
+ let src =
491
+ forbidden_edge. index_to_node . lock ( ) [ & dep_node_index] ;
492
+ if forbidden_edge. test ( & src, & target) {
493
+ panic ! (
494
+ "forbidden edge {:?} -> {:?} created" ,
495
+ src, target
496
+ )
497
+ }
498
+ }
499
+ }
500
+ }
501
+ } else if cfg ! ( debug_assertions) {
502
+ data. current . total_duplicate_read_count . fetch_add ( 1 , Relaxed ) ;
503
+ }
504
+ } ) ,
471
505
TaskDepsRef :: EvalAlways => {
472
506
// We don't need to record dependencies of eval_always
473
507
// queries. They are re-evaluated unconditionally anyway.
@@ -478,41 +512,6 @@ impl<K: DepKind> DepGraph<K> {
478
512
panic ! ( "Illegal read of: {dep_node_index:?}" )
479
513
}
480
514
} ;
481
- let task_deps = & mut * task_deps;
482
-
483
- if cfg ! ( debug_assertions) {
484
- data. current . total_read_count . fetch_add ( 1 , Relaxed ) ;
485
- }
486
-
487
- // As long as we only have a low number of reads we can avoid doing a hash
488
- // insert and potentially allocating/reallocating the hashmap
489
- let new_read = if task_deps. reads . len ( ) < TASK_DEPS_READS_CAP {
490
- task_deps. reads . iter ( ) . all ( |other| * other != dep_node_index)
491
- } else {
492
- task_deps. read_set . insert ( dep_node_index)
493
- } ;
494
- if new_read {
495
- task_deps. reads . push ( dep_node_index) ;
496
- if task_deps. reads . len ( ) == TASK_DEPS_READS_CAP {
497
- // Fill `read_set` with what we have so far so we can use the hashset
498
- // next time
499
- task_deps. read_set . extend ( task_deps. reads . iter ( ) . copied ( ) ) ;
500
- }
501
-
502
- #[ cfg( debug_assertions) ]
503
- {
504
- if let Some ( target) = task_deps. node {
505
- if let Some ( ref forbidden_edge) = data. current . forbidden_edge {
506
- let src = forbidden_edge. index_to_node . lock ( ) [ & dep_node_index] ;
507
- if forbidden_edge. test ( & src, & target) {
508
- panic ! ( "forbidden edge {:?} -> {:?} created" , src, target)
509
- }
510
- }
511
- }
512
- }
513
- } else if cfg ! ( debug_assertions) {
514
- data. current . total_duplicate_read_count . fetch_add ( 1 , Relaxed ) ;
515
- }
516
515
} )
517
516
}
518
517
}
@@ -574,7 +573,9 @@ impl<K: DepKind> DepGraph<K> {
574
573
575
574
let mut edges = SmallVec :: new ( ) ;
576
575
K :: read_deps ( |task_deps| match task_deps {
577
- TaskDepsRef :: Allow ( deps) => edges. extend ( deps. lock ( ) . reads . iter ( ) . copied ( ) ) ,
576
+ TaskDepsRef :: Allow ( deps) => {
577
+ deps. with_borrow ( |deps| edges. extend ( deps. reads . iter ( ) . copied ( ) ) )
578
+ }
578
579
TaskDepsRef :: EvalAlways => {
579
580
edges. push ( DepNodeIndex :: FOREVER_RED_NODE ) ;
580
581
}
@@ -627,14 +628,11 @@ impl<K: DepKind> DepGraphData<K> {
627
628
#[ inline]
628
629
pub fn dep_node_index_of_opt ( & self , dep_node : & DepNode < K > ) -> Option < DepNodeIndex > {
629
630
if let Some ( prev_index) = self . previous . node_to_index_opt ( dep_node) {
630
- self . current . prev_index_to_index . lock ( ) [ prev_index]
631
+ self . current . prev_index_to_index . with_borrow ( |nodes| nodes [ prev_index] )
631
632
} else {
632
633
self . current
633
634
. new_node_to_index
634
- . get_shard_by_value ( dep_node)
635
- . lock ( )
636
- . get ( dep_node)
637
- . copied ( )
635
+ . with_get_shard_by_value ( dep_node, |node| node. get ( dep_node) . copied ( ) )
638
636
}
639
637
}
640
638
@@ -670,7 +668,7 @@ impl<K: DepKind> DepGraphData<K> {
670
668
}
671
669
672
670
pub fn mark_debug_loaded_from_disk ( & self , dep_node : DepNode < K > ) {
673
- self . debug_loaded_from_disk . lock ( ) . insert ( dep_node) ;
671
+ self . debug_loaded_from_disk . with_lock ( |node| node . insert ( dep_node) ) ;
674
672
}
675
673
}
676
674
@@ -693,7 +691,11 @@ impl<K: DepKind> DepGraph<K> {
693
691
}
694
692
695
693
pub fn debug_was_loaded_from_disk ( & self , dep_node : DepNode < K > ) -> bool {
696
- self . data . as_ref ( ) . unwrap ( ) . debug_loaded_from_disk . lock ( ) . contains ( & dep_node)
694
+ self . data
695
+ . as_ref ( )
696
+ . unwrap ( )
697
+ . debug_loaded_from_disk
698
+ . with_borrow ( |node| node. contains ( & dep_node) )
697
699
}
698
700
699
701
#[ inline( always) ]
@@ -703,15 +705,15 @@ impl<K: DepKind> DepGraph<K> {
703
705
{
704
706
let dep_node_debug = & self . data . as_ref ( ) . unwrap ( ) . dep_node_debug ;
705
707
706
- if dep_node_debug. borrow ( ) . contains_key ( & dep_node) {
708
+ if dep_node_debug. with_borrow ( |node| node . contains_key ( & dep_node) ) {
707
709
return ;
708
710
}
709
711
let debug_str = self . with_ignore ( debug_str_gen) ;
710
- dep_node_debug. borrow_mut ( ) . insert ( dep_node, debug_str) ;
712
+ dep_node_debug. with_lock ( |node| node . insert ( dep_node, debug_str) ) ;
711
713
}
712
714
713
715
pub fn dep_node_debug_str ( & self , dep_node : DepNode < K > ) -> Option < String > {
714
- self . data . as_ref ( ) ?. dep_node_debug . borrow ( ) . get ( & dep_node) . cloned ( )
716
+ self . data . as_ref ( ) ?. dep_node_debug . with_borrow ( |node| node . get ( & dep_node) . cloned ( ) )
715
717
}
716
718
717
719
fn node_color ( & self , dep_node : & DepNode < K > ) -> Option < DepNodeColor > {
@@ -1163,10 +1165,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
1163
1165
record_stats,
1164
1166
) ) ,
1165
1167
new_node_to_index : Sharded :: new ( || {
1166
- FxHashMap :: with_capacity_and_hasher (
1167
- new_node_count_estimate / sharded:: SHARDS ,
1168
- Default :: default ( ) ,
1169
- )
1168
+ FxHashMap :: with_capacity_and_hasher ( new_node_count_estimate, Default :: default ( ) )
1170
1169
} ) ,
1171
1170
prev_index_to_index : Lock :: new ( IndexVec :: from_elem_n ( None , prev_graph_node_count) ) ,
1172
1171
anon_id_seed,
@@ -1199,16 +1198,16 @@ impl<K: DepKind> CurrentDepGraph<K> {
1199
1198
edges : EdgesVec ,
1200
1199
current_fingerprint : Fingerprint ,
1201
1200
) -> DepNodeIndex {
1202
- let dep_node_index = match self . new_node_to_index . get_shard_by_value ( & key ) . lock ( ) . entry ( key )
1203
- {
1204
- Entry :: Occupied ( entry) => * entry. get ( ) ,
1205
- Entry :: Vacant ( entry) => {
1206
- let dep_node_index =
1207
- self . encoder . borrow ( ) . send ( profiler, key, current_fingerprint, edges) ;
1208
- entry. insert ( dep_node_index) ;
1209
- dep_node_index
1210
- }
1211
- } ;
1201
+ let dep_node_index =
1202
+ self . new_node_to_index . with_get_shard_by_value ( & key , |node| match node . entry ( key ) {
1203
+ Entry :: Occupied ( entry) => * entry. get ( ) ,
1204
+ Entry :: Vacant ( entry) => {
1205
+ let dep_node_index =
1206
+ self . encoder . borrow ( ) . send ( profiler, key, current_fingerprint, edges) ;
1207
+ entry. insert ( dep_node_index) ;
1208
+ dep_node_index
1209
+ }
1210
+ } ) ;
1212
1211
1213
1212
#[ cfg( debug_assertions) ]
1214
1213
self . record_edge ( dep_node_index, key, current_fingerprint) ;
@@ -1298,25 +1297,26 @@ impl<K: DepKind> CurrentDepGraph<K> {
1298
1297
) -> DepNodeIndex {
1299
1298
self . debug_assert_not_in_new_nodes ( prev_graph, prev_index) ;
1300
1299
1301
- let mut prev_index_to_index = self . prev_index_to_index . lock ( ) ;
1302
-
1303
- match prev_index_to_index[ prev_index] {
1304
- Some ( dep_node_index) => dep_node_index,
1305
- None => {
1306
- let key = prev_graph. index_to_node ( prev_index) ;
1307
- let edges = prev_graph
1308
- . edge_targets_from ( prev_index)
1309
- . iter ( )
1310
- . map ( |i| prev_index_to_index[ * i] . unwrap ( ) )
1311
- . collect ( ) ;
1312
- let fingerprint = prev_graph. fingerprint_by_index ( prev_index) ;
1313
- let dep_node_index = self . encoder . borrow ( ) . send ( profiler, key, fingerprint, edges) ;
1314
- prev_index_to_index[ prev_index] = Some ( dep_node_index) ;
1315
- #[ cfg( debug_assertions) ]
1316
- self . record_edge ( dep_node_index, key, fingerprint) ;
1317
- dep_node_index
1300
+ self . prev_index_to_index . with_lock ( |prev_index_to_index| {
1301
+ match prev_index_to_index[ prev_index] {
1302
+ Some ( dep_node_index) => dep_node_index,
1303
+ None => {
1304
+ let key = prev_graph. index_to_node ( prev_index) ;
1305
+ let edges = prev_graph
1306
+ . edge_targets_from ( prev_index)
1307
+ . iter ( )
1308
+ . map ( |i| prev_index_to_index[ * i] . unwrap ( ) )
1309
+ . collect ( ) ;
1310
+ let fingerprint = prev_graph. fingerprint_by_index ( prev_index) ;
1311
+ let dep_node_index =
1312
+ self . encoder . borrow ( ) . send ( profiler, key, fingerprint, edges) ;
1313
+ prev_index_to_index[ prev_index] = Some ( dep_node_index) ;
1314
+ #[ cfg( debug_assertions) ]
1315
+ self . record_edge ( dep_node_index, key, fingerprint) ;
1316
+ dep_node_index
1317
+ }
1318
1318
}
1319
- }
1319
+ } )
1320
1320
}
1321
1321
1322
1322
#[ inline]
@@ -1327,7 +1327,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
1327
1327
) {
1328
1328
let node = & prev_graph. index_to_node ( prev_index) ;
1329
1329
debug_assert ! (
1330
- !self . new_node_to_index. get_shard_by_value ( node) . lock( ) . contains_key( node) ,
1330
+ !self . new_node_to_index. with_get_shard_by_value ( node, | lock| lock . contains_key( node) ) ,
1331
1331
"node from previous graph present in new node collection"
1332
1332
) ;
1333
1333
}
0 commit comments