@@ -14,7 +14,7 @@ use cstore::{self, CStore, CrateSource, MetadataBlob};
1414use locator:: { self , CratePaths } ;
1515use native_libs:: relevant_lib;
1616use schema:: CrateRoot ;
17- use rustc_data_structures:: sync:: Lrc ;
17+ use rustc_data_structures:: sync:: { Lrc , RwLock , Lock } ;
1818
1919use rustc:: hir:: def_id:: { CrateNum , CRATE_DEF_INDEX } ;
2020use rustc:: hir:: svh:: Svh ;
@@ -30,7 +30,6 @@ use rustc::util::common::record_time;
3030use rustc:: util:: nodemap:: FxHashSet ;
3131use rustc:: hir:: map:: Definitions ;
3232
33- use std:: cell:: { RefCell , Cell } ;
3433use std:: ops:: Deref ;
3534use std:: path:: PathBuf ;
3635use std:: { cmp, fs} ;
@@ -63,7 +62,7 @@ fn dump_crates(cstore: &CStore) {
6362 info ! ( " name: {}" , data. name( ) ) ;
6463 info ! ( " cnum: {}" , data. cnum) ;
6564 info ! ( " hash: {}" , data. hash( ) ) ;
66- info ! ( " reqd: {:?}" , data. dep_kind. get ( ) ) ;
65+ info ! ( " reqd: {:?}" , * data. dep_kind. lock ( ) ) ;
6766 let CrateSource { dylib, rlib, rmeta } = data. source . clone ( ) ;
6867 dylib. map ( |dl| info ! ( " dylib: {}" , dl. 0 . display( ) ) ) ;
6968 rlib. map ( |rl| info ! ( " rlib: {}" , rl. 0 . display( ) ) ) ;
@@ -233,19 +232,19 @@ impl<'a> CrateLoader<'a> {
233232
234233 let mut cmeta = cstore:: CrateMetadata {
235234 name,
236- extern_crate : Cell :: new ( None ) ,
235+ extern_crate : Lock :: new ( None ) ,
237236 def_path_table : Lrc :: new ( def_path_table) ,
238237 trait_impls,
239238 proc_macros : crate_root. macro_derive_registrar . map ( |_| {
240239 self . load_derive_macros ( & crate_root, dylib. clone ( ) . map ( |p| p. 0 ) , span)
241240 } ) ,
242241 root : crate_root,
243242 blob : metadata,
244- cnum_map : RefCell :: new ( cnum_map) ,
243+ cnum_map : Lock :: new ( cnum_map) ,
245244 cnum,
246- codemap_import_info : RefCell :: new ( vec ! [ ] ) ,
247- attribute_cache : RefCell :: new ( [ Vec :: new ( ) , Vec :: new ( ) ] ) ,
248- dep_kind : Cell :: new ( dep_kind) ,
245+ codemap_import_info : RwLock :: new ( vec ! [ ] ) ,
246+ attribute_cache : Lock :: new ( [ Vec :: new ( ) , Vec :: new ( ) ] ) ,
247+ dep_kind : Lock :: new ( dep_kind) ,
249248 source : cstore:: CrateSource {
250249 dylib,
251250 rlib,
@@ -335,7 +334,9 @@ impl<'a> CrateLoader<'a> {
335334 if data. root . macro_derive_registrar . is_some ( ) {
336335 dep_kind = DepKind :: UnexportedMacrosOnly ;
337336 }
338- data. dep_kind . set ( cmp:: max ( data. dep_kind . get ( ) , dep_kind) ) ;
337+ data. dep_kind . with_lock ( |data_dep_kind| {
338+ * data_dep_kind = cmp:: max ( * data_dep_kind, dep_kind) ;
339+ } ) ;
339340 ( cnum, data)
340341 }
341342 LoadResult :: Loaded ( library) => {
@@ -379,14 +380,14 @@ impl<'a> CrateLoader<'a> {
379380 if !visited. insert ( ( cnum, extern_crate. direct ) ) { return }
380381
381382 let cmeta = self . cstore . get_crate_data ( cnum) ;
382- let old_extern_crate = cmeta. extern_crate . get ( ) ;
383+ let mut old_extern_crate = cmeta. extern_crate . borrow_mut ( ) ;
383384
384385 // Prefer:
385386 // - something over nothing (tuple.0);
386387 // - direct extern crate to indirect (tuple.1);
387388 // - shorter paths to longer (tuple.2).
388389 let new_rank = ( true , extern_crate. direct , !extern_crate. path_len ) ;
389- let old_rank = match old_extern_crate {
390+ let old_rank = match * old_extern_crate {
390391 None => ( false , false , !0 ) ,
391392 Some ( ref c) => ( true , c. direct , !c. path_len ) ,
392393 } ;
@@ -395,7 +396,9 @@ impl<'a> CrateLoader<'a> {
395396 return ; // no change needed
396397 }
397398
398- cmeta. extern_crate . set ( Some ( extern_crate) ) ;
399+ * old_extern_crate = Some ( extern_crate) ;
400+ drop ( old_extern_crate) ;
401+
399402 // Propagate the extern crate info to dependencies.
400403 extern_crate. direct = false ;
401404 for & dep_cnum in cmeta. cnum_map . borrow ( ) . iter ( ) {
@@ -646,7 +649,7 @@ impl<'a> CrateLoader<'a> {
646649 // #![panic_runtime] crate.
647650 self . inject_dependency_if ( cnum, "a panic runtime" ,
648651 & |data| data. needs_panic_runtime ( sess) ) ;
649- runtime_found = runtime_found || data. dep_kind . get ( ) == DepKind :: Explicit ;
652+ runtime_found = runtime_found || * data. dep_kind . lock ( ) == DepKind :: Explicit ;
650653 }
651654 } ) ;
652655
0 commit comments