]> git.lizzy.rs Git - rust.git/commitdiff
Use MTRef and MTLock to avoid a RefCell
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Fri, 8 Jun 2018 15:49:21 +0000 (17:49 +0200)
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Tue, 19 Jun 2018 01:19:50 +0000 (03:19 +0200)
src/librustc_mir/monomorphize/collector.rs

index 9e1223fe29cd68d8a5f571cd3b11cd6c2361c4ac..96aeb969d89f96eb20f367b49609748498373db2 100644 (file)
 use monomorphize::item::{MonoItemExt, DefPathBasedNames, InstantiationMode};
 
 use rustc_data_structures::bitvec::BitVector;
-use rustc_data_structures::sync::{ParallelIterator, par_iter, Lock};
+use rustc_data_structures::sync::{MTRef, MTLock, ParallelIterator, par_iter};
 
 #[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)]
 pub enum MonoItemCollectionMode {
@@ -305,19 +305,25 @@ pub fn collect_crate_mono_items<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
     });
 
     debug!("Building mono item graph, beginning at roots");
-    let visited = Lock::new(FxHashSet());
-    let inlining_map = Lock::new(InliningMap::new());
-
-    time(tcx.sess, "collecting mono items", || {
-        par_iter(roots).for_each(|root| {
-            let mut recursion_depths = DefIdMap();
-            collect_items_rec(tcx,
-                              root,
-                              &visited,
-                              &mut recursion_depths,
-                              &inlining_map);
+
+    let mut visited = MTLock::new(FxHashSet());
+    let mut inlining_map = MTLock::new(InliningMap::new());
+
+    {
+        let visited: MTRef<'_, _> = &mut visited;
+        let inlining_map: MTRef<'_, _> = &mut inlining_map;
+
+        time(tcx.sess, "collecting mono items", || {
+            par_iter(roots).for_each(|root| {
+                let mut recursion_depths = DefIdMap();
+                collect_items_rec(tcx,
+                                root,
+                                visited,
+                                &mut recursion_depths,
+                                inlining_map);
+            });
         });
-    });
+    }
 
     (visited.into_inner(), inlining_map.into_inner())
 }
@@ -360,10 +366,10 @@ fn collect_roots<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
 // Collect all monomorphized items reachable from `starting_point`
 fn collect_items_rec<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                                    starting_point: MonoItem<'tcx>,
-                                   visited: &Lock<FxHashSet<MonoItem<'tcx>>>,
+                                   visited: MTRef<'_, MTLock<FxHashSet<MonoItem<'tcx>>>>,
                                    recursion_depths: &mut DefIdMap<usize>,
-                                   inlining_map: &Lock<InliningMap<'tcx>>) {
-    if !visited.lock().insert(starting_point.clone()) {
+                                   inlining_map: MTRef<'_, MTLock<InliningMap<'tcx>>>) {
+    if !visited.lock_mut().insert(starting_point.clone()) {
         // We've been here already, no need to search again.
         return;
     }
@@ -434,7 +440,7 @@ fn collect_items_rec<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
 fn record_accesses<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                              caller: MonoItem<'tcx>,
                              callees: &[MonoItem<'tcx>],
-                             inlining_map: &Lock<InliningMap<'tcx>>) {
+                             inlining_map: MTRef<'_, MTLock<InliningMap<'tcx>>>) {
     let is_inlining_candidate = |mono_item: &MonoItem<'tcx>| {
         mono_item.instantiation_mode(tcx) == InstantiationMode::LocalCopy
     };
@@ -444,7 +450,7 @@ fn record_accesses<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                              (*mono_item, is_inlining_candidate(mono_item))
                           });
 
-    inlining_map.lock().record_accesses(caller, accesses);
+    inlining_map.lock_mut().record_accesses(caller, accesses);
 }
 
 fn check_recursion_limit<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,