diff options
| author | Yoshiki Matsuda <myskjp@gmail.com> | 2022-05-08 12:36:12 +0900 | 
|---|---|---|
| committer | Yoshiki Matsuda <myskjp@gmail.com> | 2022-07-02 22:54:37 +0900 | 
| commit | c57d7788729f32e74966f67eea582ec7ec75a133 (patch) | |
| tree | 6adc8ea3e9963f566aa4049a94d7b8b9b0a040da | |
| parent | 47c36893a14b689faadeaa06b56e53d36f526c2f (diff) | |
| download | rust-c57d7788729f32e74966f67eea582ec7ec75a133.tar.gz rust-c57d7788729f32e74966f67eea582ec7ec75a133.zip | |
define MmapMut and use it in Decodable impl
| -rw-r--r-- | compiler/rustc_data_structures/src/memmap.rs | 63 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/encoder.rs | 25 | 
2 files changed, 74 insertions, 14 deletions
| diff --git a/compiler/rustc_data_structures/src/memmap.rs b/compiler/rustc_data_structures/src/memmap.rs index 26b26415eea..917416df6b8 100644 --- a/compiler/rustc_data_structures/src/memmap.rs +++ b/compiler/rustc_data_structures/src/memmap.rs @@ -1,6 +1,6 @@ use std::fs::File; use std::io; -use std::ops::Deref; +use std::ops::{Deref, DerefMut}; use crate::owning_ref::StableAddress; @@ -45,3 +45,64 @@ impl Deref for Mmap { // export any function that can cause the `Vec` to be re-allocated. As such the address of the // bytes inside this `Vec` is stable. unsafe impl StableAddress for Mmap {} + +#[cfg(not(target_arch = "wasm32"))] +pub struct MmapMut(memmap2::MmapMut); + +#[cfg(target_arch = "wasm32")] +pub struct MmapMut(Vec<u8>); + +#[cfg(not(target_arch = "wasm32"))] +impl MmapMut { + #[inline] + pub fn map_anon(len: usize) -> io::Result<Self> { + let mmap = memmap2::MmapMut::map_anon(len)?; + Ok(MmapMut(mmap)) + } + + #[inline] + pub fn flush(&mut self) -> io::Result<()> { + self.0.flush() + } + + #[inline] + pub fn make_read_only(self) -> std::io::Result<Mmap> { + let mmap = self.0.make_read_only()?; + Ok(Mmap(mmap)) + } +} + +#[cfg(target_arch = "wasm32")] +impl MmapMut { + #[inline] + pub fn map_anon(len: usize) -> io::Result<Self> { + let data = Vec::with_capacity(len); + Ok(MmapMut(data)) + } + + #[inline] + pub fn flush(&mut self) -> io::Result<()> { + Ok(()) + } + + #[inline] + pub fn make_read_only(self) -> std::io::Result<Mmap> { + Ok(Mmap(self.0)) + } +} + +impl Deref for MmapMut { + type Target = [u8]; + + #[inline] + fn deref(&self) -> &[u8] { + &*self.0 + } +} + +impl DerefMut for MmapMut { + #[inline] + fn deref_mut(&mut self) -> &mut [u8] { + &mut *self.0 + } +} diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 7980cb6a132..f3853255f7b 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -4,7 +4,7 @@ use crate::rmeta::*; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::{FxHashMap, FxIndexSet}; -use rustc_data_structures::memmap::Mmap; +use rustc_data_structures::memmap::{Mmap, MmapMut}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::sync::{join, par_iter, Lrc, ParallelIterator}; use rustc_data_structures::temp_dir::MaybeTempDir; @@ -44,7 +44,6 @@ use std::io::{Read, Seek, Write}; use std::iter; use std::num::NonZeroUsize; use std::path::{Path, PathBuf}; -use tempfile::Builder as TempFileBuilder; use tracing::{debug, trace}; pub(super) struct EncodeContext<'a, 'tcx> { @@ -2179,19 +2178,19 @@ impl<S: Encoder> Encodable<S> for EncodedMetadata { impl<D: Decoder> Decodable<D> for EncodedMetadata { fn decode(d: &mut D) -> Self { - let temp_dir = TempFileBuilder::new().prefix("decoded").tempdir().unwrap(); - let temp_dir = MaybeTempDir::new(temp_dir, false); - let filename = temp_dir.as_ref().join("decoded"); - let file = std::fs::File::create(&filename).unwrap(); - let mut file = std::io::BufWriter::new(file); - let len = d.read_usize(); - for _ in 0..len { - file.write(&[d.read_u8()]).unwrap(); - } - file.flush().unwrap(); + let mmap = if len > 0 { + let mut mmap = MmapMut::map_anon(len).unwrap(); + for _ in 0..len { + (&mut mmap[..]).write(&[d.read_u8()]).unwrap(); + } + mmap.flush().unwrap(); + Some(mmap.make_read_only().unwrap()) + } else { + None + }; - Self::from_path(filename, Some(temp_dir)).unwrap() + Self { mmap, _temp_dir: None } } } | 
