about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2018-02-15 10:52:26 +0100
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2018-03-12 17:01:35 +0100
commit5b8f9c5fe238500fcbe7c3e432ea623370058524 (patch)
tree79ddcf58d930bcb156e4080be8932de5a44b20cf /src
parent4edb539159f26c366d6b0606a20e66fe727b78ec (diff)
Make CStore thread-safe
Diffstat (limited to 'src')
-rw-r--r--src/librustc_metadata/cstore.rs10
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)
     }