Don't use Lock for heavily accessed CrateMetadata::cnum_map.
This commit is contained in:
parent
295d98069f
commit
ea4942835d
@ -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<CrateNum> = 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -64,8 +64,9 @@ pub struct CrateMetadata {
|
||||
pub extern_crate: Lock<Option<ExternCrate>>,
|
||||
|
||||
pub blob: MetadataBlob,
|
||||
pub cnum_map: Lock<CrateNumMap>,
|
||||
pub cnum_map: CrateNumMap,
|
||||
pub cnum: CrateNum,
|
||||
pub dependencies: Lock<Vec<CrateNum>>,
|
||||
pub codemap_import_info: RwLock<Vec<ImportedFileMap>>,
|
||||
pub attribute_cache: Lock<[Vec<Option<Lrc<[ast::Attribute]>>>; 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);
|
||||
}
|
||||
|
@ -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<DefId> {
|
||||
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()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user