From ea4942835d607ffa87eb7f50552e6cf023d27403 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Tue, 8 May 2018 14:32:31 +0200 Subject: [PATCH] Don't use Lock for heavily accessed CrateMetadata::cnum_map. --- src/librustc_metadata/creader.rs | 9 ++++++--- src/librustc_metadata/cstore.rs | 5 +++-- src/librustc_metadata/decoder.rs | 6 +++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index d0237071a6058..7efcedd73eddf 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -219,6 +219,8 @@ impl<'a> CrateLoader<'a> { let cnum_map = self.resolve_crate_deps(root, &crate_root, &metadata, cnum, span, dep_kind); + let dependencies: Vec = cnum_map.iter().cloned().collect(); + let def_path_table = record_time(&self.sess.perf_stats.decode_def_path_tables_time, || { crate_root.def_path_table.decode((&metadata, self.sess)) }); @@ -239,8 +241,9 @@ impl<'a> CrateLoader<'a> { }), root: crate_root, blob: metadata, - cnum_map: Lock::new(cnum_map), + cnum_map, cnum, + dependencies: Lock::new(dependencies), codemap_import_info: RwLock::new(vec![]), attribute_cache: Lock::new([Vec::new(), Vec::new()]), dep_kind: Lock::new(dep_kind), @@ -392,7 +395,7 @@ impl<'a> CrateLoader<'a> { // Propagate the extern crate info to dependencies. extern_crate.direct = false; - for &dep_cnum in cmeta.cnum_map.borrow().iter() { + for &dep_cnum in cmeta.dependencies.borrow().iter() { self.update_extern_crate(dep_cnum, extern_crate, visited); } } @@ -1040,7 +1043,7 @@ impl<'a> CrateLoader<'a> { } info!("injecting a dep from {} to {}", cnum, krate); - data.cnum_map.borrow_mut().push(krate); + data.dependencies.borrow_mut().push(krate); }); } } diff --git a/src/librustc_metadata/cstore.rs b/src/librustc_metadata/cstore.rs index 64bbcf436cb9e..f4d4bd3589398 100644 --- a/src/librustc_metadata/cstore.rs +++ b/src/librustc_metadata/cstore.rs @@ -64,8 +64,9 @@ pub struct CrateMetadata { pub extern_crate: Lock>, pub blob: MetadataBlob, - pub cnum_map: Lock, + pub cnum_map: CrateNumMap, pub cnum: CrateNum, + pub dependencies: Lock>, pub codemap_import_info: RwLock>, pub attribute_cache: Lock<[Vec>>; 2]>, @@ -144,7 +145,7 @@ impl CStore { } let data = self.get_crate_data(krate); - for &dep in data.cnum_map.borrow().iter() { + for &dep in data.dependencies.borrow().iter() { if dep != krate { self.push_dependencies_in_postorder(ordering, dep); } diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 57f92707ccfe3..53d1ff156274e 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -246,7 +246,7 @@ impl<'a, 'tcx: 'a> TyDecoder<'a, 'tcx> for DecodeContext<'a, 'tcx> { if cnum == LOCAL_CRATE { self.cdata().cnum } else { - self.cdata().cnum_map.borrow()[cnum] + self.cdata().cnum_map[cnum] } } } @@ -932,7 +932,7 @@ impl<'a, 'tcx> CrateMetadata { // Translate a DefId from the current compilation environment to a DefId // for an external crate. fn reverse_translate_def_id(&self, did: DefId) -> Option { - for (local, &global) in self.cnum_map.borrow().iter_enumerated() { + for (local, &global) in self.cnum_map.iter_enumerated() { if global == did.krate { return Some(DefId { krate: local, @@ -1007,7 +1007,7 @@ impl<'a, 'tcx> CrateMetadata { .enumerate() .flat_map(|(i, link)| { let cnum = CrateNum::new(i + 1); - link.map(|link| (self.cnum_map.borrow()[cnum], link)) + link.map(|link| (self.cnum_map[cnum], link)) }) .collect() }