Auto merge of #83682 - bjorn3:mmap_wrapper, r=cjgillot
Add an Mmap wrapper to rustc_data_structures This wrapper implements StableAddress and falls back to directly reading the file on wasm32. Taken from #83640, which I will close due to the perf regression.
This commit is contained in:
commit
97717a5618
12 changed files with 63 additions and 50 deletions
|
@ -11,7 +11,6 @@ doctest = false
|
|||
libc = "0.2"
|
||||
snap = "1"
|
||||
tracing = "0.1"
|
||||
memmap2 = "0.2.1"
|
||||
smallvec = { version = "1.6.1", features = ["union", "may_dangle"] }
|
||||
rustc_middle = { path = "../rustc_middle" }
|
||||
rustc_attr = { path = "../rustc_attr" }
|
||||
|
|
|
@ -216,6 +216,7 @@ use crate::creader::Library;
|
|||
use crate::rmeta::{rustc_version, MetadataBlob, METADATA_HEADER};
|
||||
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::memmap::Mmap;
|
||||
use rustc_data_structures::owning_ref::OwningRef;
|
||||
use rustc_data_structures::svh::Svh;
|
||||
use rustc_data_structures::sync::MetadataRef;
|
||||
|
@ -232,7 +233,6 @@ use rustc_target::spec::{Target, TargetTriple};
|
|||
|
||||
use snap::read::FrameDecoder;
|
||||
use std::io::{Read, Result as IoResult, Write};
|
||||
use std::ops::Deref;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::{cmp, fmt, fs};
|
||||
use tracing::{debug, info, warn};
|
||||
|
@ -727,19 +727,6 @@ impl<'a> CrateLocator<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
/// A trivial wrapper for `Mmap` that implements `StableDeref`.
|
||||
struct StableDerefMmap(memmap2::Mmap);
|
||||
|
||||
impl Deref for StableDerefMmap {
|
||||
type Target = [u8];
|
||||
|
||||
fn deref(&self) -> &[u8] {
|
||||
self.0.deref()
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl stable_deref_trait::StableDeref for StableDerefMmap {}
|
||||
|
||||
fn get_metadata_section(
|
||||
target: &Target,
|
||||
flavor: CrateFlavor,
|
||||
|
@ -779,11 +766,11 @@ fn get_metadata_section(
|
|||
// mmap the file, because only a small fraction of it is read.
|
||||
let file = std::fs::File::open(filename)
|
||||
.map_err(|_| format!("failed to open rmeta metadata: '{}'", filename.display()))?;
|
||||
let mmap = unsafe { memmap2::Mmap::map(&file) };
|
||||
let mmap = unsafe { Mmap::map(file) };
|
||||
let mmap = mmap
|
||||
.map_err(|_| format!("failed to mmap rmeta metadata: '{}'", filename.display()))?;
|
||||
|
||||
rustc_erase_owner!(OwningRef::new(StableDerefMmap(mmap)).map_owner_box())
|
||||
rustc_erase_owner!(OwningRef::new(mmap).map_owner_box())
|
||||
}
|
||||
};
|
||||
let blob = MetadataBlob::new(raw_bytes);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue