mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-09 16:37:36 +00:00
define MmapMut and use it in Decodable impl
This commit is contained in:
parent
47c36893a1
commit
c57d778872
@ -1,6 +1,6 @@
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::ops::Deref;
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
use crate::owning_ref::StableAddress;
|
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
|
// export any function that can cause the `Vec` to be re-allocated. As such the address of the
|
||||||
// bytes inside this `Vec` is stable.
|
// bytes inside this `Vec` is stable.
|
||||||
unsafe impl StableAddress for Mmap {}
|
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::fingerprint::Fingerprint;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
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::stable_hasher::{HashStable, StableHasher};
|
||||||
use rustc_data_structures::sync::{join, par_iter, Lrc, ParallelIterator};
|
use rustc_data_structures::sync::{join, par_iter, Lrc, ParallelIterator};
|
||||||
use rustc_data_structures::temp_dir::MaybeTempDir;
|
use rustc_data_structures::temp_dir::MaybeTempDir;
|
||||||
@ -44,7 +44,6 @@ use std::io::{Read, Seek, Write};
|
|||||||
use std::iter;
|
use std::iter;
|
||||||
use std::num::NonZeroUsize;
|
use std::num::NonZeroUsize;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use tempfile::Builder as TempFileBuilder;
|
|
||||||
use tracing::{debug, trace};
|
use tracing::{debug, trace};
|
||||||
|
|
||||||
pub(super) struct EncodeContext<'a, 'tcx> {
|
pub(super) struct EncodeContext<'a, 'tcx> {
|
||||||
@ -2179,19 +2178,19 @@ impl<S: Encoder> Encodable<S> for EncodedMetadata {
|
|||||||
|
|
||||||
impl<D: Decoder> Decodable<D> for EncodedMetadata {
|
impl<D: Decoder> Decodable<D> for EncodedMetadata {
|
||||||
fn decode(d: &mut D) -> Self {
|
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();
|
let len = d.read_usize();
|
||||||
|
let mmap = if len > 0 {
|
||||||
|
let mut mmap = MmapMut::map_anon(len).unwrap();
|
||||||
for _ in 0..len {
|
for _ in 0..len {
|
||||||
file.write(&[d.read_u8()]).unwrap();
|
(&mut mmap[..]).write(&[d.read_u8()]).unwrap();
|
||||||
}
|
}
|
||||||
file.flush().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 New Issue
Block a user