Auto merge of #96544 - m-ysk:feature/issue-96358, r=cjgillot
Stop keeping metadata in memory before writing it to disk Fixes #96358 I created this PR according with the instruction given in the issue except for the following points: - While the issue says "Write metadata into the temporary file in `encode_and_write_metadata` even if `!need_metadata_file`", I could not do that. That is because though I tried to do that and run `x.py test`, I got a lot of test failures as follows. <details> <summary>List of failed tests</summary> <pre> <code> failures: [ui] src/test/ui/json-multiple.rs [ui] src/test/ui/json-options.rs [ui] src/test/ui/rmeta/rmeta-rpass.rs [ui] src/test/ui/save-analysis/emit-notifications.rs [ui] src/test/ui/svh/changing-crates.rs [ui] src/test/ui/svh/svh-change-lit.rs [ui] src/test/ui/svh/svh-change-significant-cfg.rs [ui] src/test/ui/svh/svh-change-trait-bound.rs [ui] src/test/ui/svh/svh-change-type-arg.rs [ui] src/test/ui/svh/svh-change-type-ret.rs [ui] src/test/ui/svh/svh-change-type-static.rs [ui] src/test/ui/svh/svh-use-trait.rs test result: FAILED. 12915 passed; 12 failed; 100 ignored; 0 measured; 0 filtered out; finished in 71.41s Some tests failed in compiletest suite=ui mode=ui host=x86_64-unknown-linux-gnu target=x86_64-unknown-linux-gnu Build completed unsuccessfully in 0:01:58 </code> </pre> </details> - I could not resolve the extra tasks about `create_rmeta_file` and `create_compressed_metadata_file` for my lack of ability.
This commit is contained in:
commit
1ba1fec234
16 changed files with 300 additions and 147 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
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue