diff --git a/src/cmd/rel.rs b/src/cmd/rel.rs index adbf28c..0c30405 100644 --- a/src/cmd/rel.rs +++ b/src/cmd/rel.rs @@ -300,7 +300,15 @@ fn make(args: MakeArgs) -> Result<()> { } // Load all modules - let mut files = paths.iter().map(|p| open_file(p, true)).collect::>>()?; + let mut files = paths + .iter() + .map(|p| { + let mut file = open_file(p, true)?; + // Immediately map to avoid keeping file handles open + file.map()?; + Ok(file) + }) + .collect::>>()?; let modules = files .par_iter_mut() .enumerate() diff --git a/src/vfs/std_fs.rs b/src/vfs/std_fs.rs index 3a75b64..df03265 100644 --- a/src/vfs/std_fs.rs +++ b/src/vfs/std_fs.rs @@ -86,14 +86,17 @@ impl Seek for StdFile { impl VfsFile for StdFile { fn map(&mut self) -> io::Result<&[u8]> { - let file = match self.file { - Some(ref mut file) => file, - None => self.file.insert(BufReader::new(fs::File::open(&self.path)?)), - }; let mmap = match self.mmap { Some(ref mmap) => mmap, - None => self.mmap.insert(unsafe { memmap2::Mmap::map(file.get_ref())? }), + None => { + let file = match self.file { + Some(ref mut file) => file, + None => self.file.insert(BufReader::new(fs::File::open(&self.path)?)), + }; + self.mmap.insert(unsafe { memmap2::Mmap::map(file.get_ref())? }) + } }; + self.file = None; // Drop the BufReader to avoid holding the file handle Ok(mmap) }