diff options
| author | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2018-02-15 10:52:26 +0100 |
|---|---|---|
| committer | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2018-03-12 17:01:35 +0100 |
| commit | 5b8f9c5fe238500fcbe7c3e432ea623370058524 (patch) | |
| tree | 79ddcf58d930bcb156e4080be8932de5a44b20cf /src | |
| parent | 4edb539159f26c366d6b0606a20e66fe727b78ec (diff) | |
Make CStore thread-safe
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_metadata/cstore.rs | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/librustc_metadata/cstore.rs b/src/librustc_metadata/cstore.rs index 19f43c180de..bd5ad93946e 100644 --- a/src/librustc_metadata/cstore.rs +++ b/src/librustc_metadata/cstore.rs @@ -89,21 +89,23 @@ pub struct CrateMetadata { } pub struct CStore { - metas: RefCell<IndexVec<CrateNum, Option<Lrc<CrateMetadata>>>>, + metas: RwLock<IndexVec<CrateNum, Option<Lrc<CrateMetadata>>>>, /// Map from NodeId's of local extern crate statements to crate numbers - extern_mod_crate_map: RefCell<NodeMap<CrateNum>>, + extern_mod_crate_map: Lock<NodeMap<CrateNum>>, pub metadata_loader: Box<MetadataLoader + Sync>, } impl CStore { pub fn new(metadata_loader: Box<MetadataLoader + Sync>) -> CStore { CStore { - metas: RefCell::new(IndexVec::new()), - extern_mod_crate_map: RefCell::new(FxHashMap()), + metas: RwLock::new(IndexVec::new()), + 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 fn next_crate_num(&self) -> CrateNum { CrateNum::new(self.metas.borrow().len() + 1) } |
