Make CrateNum allocation more thread-safe.
This commit is contained in:
parent
31d2012ef7
commit
b8b957d479
@ -51,7 +51,6 @@ pub struct Library {
|
||||
pub struct CrateLoader<'a> {
|
||||
pub sess: &'a Session,
|
||||
cstore: &'a CStore,
|
||||
next_crate_num: CrateNum,
|
||||
local_crate_name: Symbol,
|
||||
}
|
||||
|
||||
@ -102,7 +101,6 @@ impl<'a> CrateLoader<'a> {
|
||||
CrateLoader {
|
||||
sess,
|
||||
cstore,
|
||||
next_crate_num: cstore.next_crate_num(),
|
||||
local_crate_name: Symbol::intern(local_crate_name),
|
||||
}
|
||||
}
|
||||
@ -198,8 +196,7 @@ impl<'a> CrateLoader<'a> {
|
||||
self.verify_no_symbol_conflicts(span, &crate_root);
|
||||
|
||||
// Claim this crate number and cache it
|
||||
let cnum = self.next_crate_num;
|
||||
self.next_crate_num = CrateNum::from_u32(cnum.as_u32() + 1);
|
||||
let cnum = self.cstore.alloc_new_crate_num();
|
||||
|
||||
// Stash paths for top-most crate locally if necessary.
|
||||
let crate_paths = if root.is_none() {
|
||||
|
@ -96,16 +96,17 @@ pub struct CStore {
|
||||
impl CStore {
|
||||
pub fn new(metadata_loader: Box<MetadataLoader + Sync>) -> CStore {
|
||||
CStore {
|
||||
metas: RwLock::new(IndexVec::new()),
|
||||
metas: RwLock::new(IndexVec::from_elem_n(None, 1)),
|
||||
extern_mod_crate_map: Lock::new(FxHashMap()),
|
||||
metadata_loader,
|
||||
}
|
||||
}
|
||||
|
||||
/// You cannot use this function to allocate a CrateNum in a thread-safe manner.
|
||||
/// It is currently only used in CrateLoader which is single-threaded code.
|
||||
pub(super) fn next_crate_num(&self) -> CrateNum {
|
||||
CrateNum::new(self.metas.borrow().len() + 1)
|
||||
pub(super) fn alloc_new_crate_num(&self) -> CrateNum {
|
||||
let mut metas = self.metas.borrow_mut();
|
||||
let cnum = CrateNum::new(metas.len());
|
||||
metas.push(None);
|
||||
cnum
|
||||
}
|
||||
|
||||
pub(super) fn get_crate_data(&self, cnum: CrateNum) -> Lrc<CrateMetadata> {
|
||||
@ -113,12 +114,9 @@ impl CStore {
|
||||
}
|
||||
|
||||
pub(super) fn set_crate_data(&self, cnum: CrateNum, data: Lrc<CrateMetadata>) {
|
||||
use rustc_data_structures::indexed_vec::Idx;
|
||||
let mut met = self.metas.borrow_mut();
|
||||
while met.len() <= cnum.index() {
|
||||
met.push(None);
|
||||
}
|
||||
met[cnum] = Some(data);
|
||||
let mut metas = self.metas.borrow_mut();
|
||||
assert!(metas[cnum].is_none(), "Overwriting crate metadata entry");
|
||||
metas[cnum] = Some(data);
|
||||
}
|
||||
|
||||
pub(super) fn iter_crate_data<I>(&self, mut i: I)
|
||||
|
Loading…
x
Reference in New Issue
Block a user