@@ -243,12 +243,14 @@ use std::cmp;
243
243
use std:: fmt;
244
244
use std:: fs;
245
245
use std:: io:: { self , Read } ;
246
+ use std:: ops:: Deref ;
246
247
use std:: path:: { Path , PathBuf } ;
247
248
use std:: time:: Instant ;
248
249
249
250
use flate2:: read:: DeflateDecoder ;
250
251
251
252
use rustc_data_structures:: owning_ref:: OwningRef ;
253
+
252
254
pub struct CrateMismatch {
253
255
path : PathBuf ,
254
256
got : String ,
@@ -856,6 +858,19 @@ fn get_metadata_section(target: &Target,
856
858
return ret;
857
859
}
858
860
861
+ /// A trivial wrapper for `Mmap` that implements `StableDeref`.
862
+ struct StableDerefMmap ( memmap:: Mmap ) ;
863
+
864
+ impl Deref for StableDerefMmap {
865
+ type Target = [ u8 ] ;
866
+
867
+ fn deref ( & self ) -> & [ u8 ] {
868
+ self . 0 . deref ( )
869
+ }
870
+ }
871
+
872
+ unsafe impl stable_deref_trait:: StableDeref for StableDerefMmap { }
873
+
859
874
fn get_metadata_section_imp ( target : & Target ,
860
875
flavor : CrateFlavor ,
861
876
filename : & Path ,
@@ -892,9 +907,14 @@ fn get_metadata_section_imp(target: &Target,
892
907
}
893
908
}
894
909
CrateFlavor :: Rmeta => {
895
- let buf = fs:: read ( filename) . map_err ( |_|
896
- format ! ( "failed to read rmeta metadata: '{}'" , filename. display( ) ) ) ?;
897
- rustc_erase_owner ! ( OwningRef :: new( buf) . map_owner_box( ) )
910
+ // mmap the file, because only a small fraction of it is read.
911
+ let file = std:: fs:: File :: open ( filename) . map_err ( |_|
912
+ format ! ( "failed to open rmeta metadata: '{}'" , filename. display( ) ) ) ?;
913
+ let mmap = unsafe { memmap:: Mmap :: map ( & file) } ;
914
+ let mmap = mmap. map_err ( |_|
915
+ format ! ( "failed to mmap rmeta metadata: '{}'" , filename. display( ) ) ) ?;
916
+
917
+ rustc_erase_owner ! ( OwningRef :: new( StableDerefMmap ( mmap) ) . map_owner_box( ) )
898
918
}
899
919
} ;
900
920
let blob = MetadataBlob ( raw_bytes) ;
0 commit comments