define MmapMut and use it in Decodable impl
This commit is contained in:
parent
47c36893a1
commit
c57d778872
2 changed files with 74 additions and 14 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue