Skip to content

Commit 8e417a4

Browse files
authored
rel make: Avoid EMFILE when loading many modules (#122)
1 parent 2a3eaf9 commit 8e417a4

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

src/cmd/rel.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,15 @@ fn make(args: MakeArgs) -> Result<()> {
300300
}
301301

302302
// Load all modules
303-
let mut files = paths.iter().map(|p| open_file(p, true)).collect::<Result<Vec<_>>>()?;
303+
let mut files = paths
304+
.iter()
305+
.map(|p| {
306+
let mut file = open_file(p, true)?;
307+
// Immediately map to avoid keeping file handles open
308+
file.map()?;
309+
Ok(file)
310+
})
311+
.collect::<Result<Vec<_>>>()?;
304312
let modules = files
305313
.par_iter_mut()
306314
.enumerate()

src/vfs/std_fs.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,17 @@ impl Seek for StdFile {
8686

8787
impl VfsFile for StdFile {
8888
fn map(&mut self) -> io::Result<&[u8]> {
89-
let file = match self.file {
90-
Some(ref mut file) => file,
91-
None => self.file.insert(BufReader::new(fs::File::open(&self.path)?)),
92-
};
9389
let mmap = match self.mmap {
9490
Some(ref mmap) => mmap,
95-
None => self.mmap.insert(unsafe { memmap2::Mmap::map(file.get_ref())? }),
91+
None => {
92+
let file = match self.file {
93+
Some(ref mut file) => file,
94+
None => self.file.insert(BufReader::new(fs::File::open(&self.path)?)),
95+
};
96+
self.mmap.insert(unsafe { memmap2::Mmap::map(file.get_ref())? })
97+
}
9698
};
99+
self.file = None; // Drop the BufReader to avoid holding the file handle
97100
Ok(mmap)
98101
}
99102

0 commit comments

Comments
 (0)