From 80a73eaa0d8fd53876a90ed2816dfa7fc5bae8a7 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Fri, 12 Apr 2019 14:27:48 +0800 Subject: [PATCH] fix close_on_spawn and file_actions --- src/libos/src/fs/file_table.rs | 37 +++++++++++------------------- src/libos/src/process/spawn/mod.rs | 3 +++ 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/libos/src/fs/file_table.rs b/src/libos/src/fs/file_table.rs index 0e60c108..2ff33e33 100644 --- a/src/libos/src/fs/file_table.rs +++ b/src/libos/src/fs/file_table.rs @@ -4,7 +4,7 @@ use std; pub type FileDesc = u32; -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] #[repr(C)] pub struct FileTable { table: Vec>, @@ -123,30 +123,19 @@ impl FileTable { None => errno!(EBADF, "Invalid file descriptor"), } } -} -impl Clone for FileTable { - fn clone(&self) -> FileTable { - // Only clone file descriptors that are not close-on-spawn - let mut num_cloned_fds = 0; - let cloned_table = self - .table - .iter() - .map(|entry| match entry { - Some(file_table_entry) => match file_table_entry.close_on_spawn { - false => { - num_cloned_fds += 1; - Some(file_table_entry.clone()) - } - true => None, - }, - None => None, - }) - .collect(); - - FileTable { - table: cloned_table, - num_fds: num_cloned_fds, + /// Remove file descriptors that are close-on-spawn + pub fn close_on_spawn(&mut self) { + for entry in self.table.iter_mut() { + let need_close = if let Some(entry) = entry { + entry.close_on_spawn + } else { + false + }; + if need_close { + *entry = None; + self.num_fds -= 1; + } } } } diff --git a/src/libos/src/process/spawn/mod.rs b/src/libos/src/process/spawn/mod.rs index 3dd58ec1..ca218537 100644 --- a/src/libos/src/process/spawn/mod.rs +++ b/src/libos/src/process/spawn/mod.rs @@ -87,6 +87,7 @@ fn init_files(parent_ref: &ProcessRef, file_actions: &[FileAction]) -> Result 0; if should_inherit_file_table { + // Fork: clone file table let mut cloned_file_table = parent.get_files().lock().unwrap().clone(); // Perform file actions to modify the cloned file table for file_action in file_actions { @@ -102,6 +103,8 @@ fn init_files(parent_ref: &ProcessRef, file_actions: &[FileAction]) -> Result