@@ -14,7 +14,7 @@ use cstore::{self, CStore, CrateSource, MetadataBlob};
14
14
use locator:: { self , CratePaths } ;
15
15
use native_libs:: relevant_lib;
16
16
use schema:: CrateRoot ;
17
- use rustc_data_structures:: sync:: Lrc ;
17
+ use rustc_data_structures:: sync:: { Lrc , RwLock , Lock } ;
18
18
19
19
use rustc:: hir:: def_id:: { CrateNum , CRATE_DEF_INDEX } ;
20
20
use rustc:: hir:: svh:: Svh ;
@@ -30,7 +30,6 @@ use rustc::util::common::record_time;
30
30
use rustc:: util:: nodemap:: FxHashSet ;
31
31
use rustc:: hir:: map:: Definitions ;
32
32
33
- use std:: cell:: { RefCell , Cell } ;
34
33
use std:: ops:: Deref ;
35
34
use std:: path:: PathBuf ;
36
35
use std:: { cmp, fs} ;
@@ -63,7 +62,7 @@ fn dump_crates(cstore: &CStore) {
63
62
info ! ( " name: {}" , data. name( ) ) ;
64
63
info ! ( " cnum: {}" , data. cnum) ;
65
64
info ! ( " hash: {}" , data. hash( ) ) ;
66
- info ! ( " reqd: {:?}" , data. dep_kind. get ( ) ) ;
65
+ info ! ( " reqd: {:?}" , * data. dep_kind. lock ( ) ) ;
67
66
let CrateSource { dylib, rlib, rmeta } = data. source . clone ( ) ;
68
67
dylib. map ( |dl| info ! ( " dylib: {}" , dl. 0 . display( ) ) ) ;
69
68
rlib. map ( |rl| info ! ( " rlib: {}" , rl. 0 . display( ) ) ) ;
@@ -233,19 +232,19 @@ impl<'a> CrateLoader<'a> {
233
232
234
233
let mut cmeta = cstore:: CrateMetadata {
235
234
name,
236
- extern_crate : Cell :: new ( None ) ,
235
+ extern_crate : Lock :: new ( None ) ,
237
236
def_path_table : Lrc :: new ( def_path_table) ,
238
237
trait_impls,
239
238
proc_macros : crate_root. macro_derive_registrar . map ( |_| {
240
239
self . load_derive_macros ( & crate_root, dylib. clone ( ) . map ( |p| p. 0 ) , span)
241
240
} ) ,
242
241
root : crate_root,
243
242
blob : metadata,
244
- cnum_map : RefCell :: new ( cnum_map) ,
243
+ cnum_map : Lock :: new ( cnum_map) ,
245
244
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) ,
249
248
source : cstore:: CrateSource {
250
249
dylib,
251
250
rlib,
@@ -335,7 +334,9 @@ impl<'a> CrateLoader<'a> {
335
334
if data. root . macro_derive_registrar . is_some ( ) {
336
335
dep_kind = DepKind :: UnexportedMacrosOnly ;
337
336
}
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
+ } ) ;
339
340
( cnum, data)
340
341
}
341
342
LoadResult :: Loaded ( library) => {
@@ -379,14 +380,14 @@ impl<'a> CrateLoader<'a> {
379
380
if !visited. insert ( ( cnum, extern_crate. direct ) ) { return }
380
381
381
382
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 ( ) ;
383
384
384
385
// Prefer:
385
386
// - something over nothing (tuple.0);
386
387
// - direct extern crate to indirect (tuple.1);
387
388
// - shorter paths to longer (tuple.2).
388
389
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 {
390
391
None => ( false , false , !0 ) ,
391
392
Some ( ref c) => ( true , c. direct , !c. path_len ) ,
392
393
} ;
@@ -395,7 +396,9 @@ impl<'a> CrateLoader<'a> {
395
396
return ; // no change needed
396
397
}
397
398
398
- cmeta. extern_crate . set ( Some ( extern_crate) ) ;
399
+ * old_extern_crate = Some ( extern_crate) ;
400
+ drop ( old_extern_crate) ;
401
+
399
402
// Propagate the extern crate info to dependencies.
400
403
extern_crate. direct = false ;
401
404
for & dep_cnum in cmeta. cnum_map . borrow ( ) . iter ( ) {
@@ -646,7 +649,7 @@ impl<'a> CrateLoader<'a> {
646
649
// #![panic_runtime] crate.
647
650
self . inject_dependency_if ( cnum, "a panic runtime" ,
648
651
& |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 ;
650
653
}
651
654
} ) ;
652
655
0 commit comments