Reduce the FileRef type to Arc<dyn File>

The FileRef type was defined as Arc<Box<dyn File>>, where the use of Box is
unnecessary. This commit reduces the type to Arc<dyn File>.
This commit is contained in:
Tate, Hongliang Tian 2020-10-31 08:58:09 +00:00 committed by Zongmin.Gu
parent 6e83595b74
commit 2ff4b1c776
7 changed files with 27 additions and 30 deletions

@ -106,7 +106,7 @@ pub trait File: Debug + Sync + Send + Any {
fn as_any(&self) -> &dyn Any; fn as_any(&self) -> &dyn Any;
} }
pub type FileRef = Arc<Box<dyn File>>; pub type FileRef = Arc<dyn File>;
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
struct FileOpNotSupportedError { struct FileOpNotSupportedError {

@ -10,8 +10,7 @@ pub fn do_openat(fs_path: &FsPath, flags: u32, mode: u32) -> Result<FileDesc> {
let current = current!(); let current = current!();
let fs = current.fs().lock().unwrap(); let fs = current.fs().lock().unwrap();
let file = fs.open_file(&path, flags, mode)?; let file_ref: Arc<dyn File> = fs.open_file(&path, flags, mode)?;
let file_ref: Arc<Box<dyn File>> = Arc::new(file);
let fd = { let fd = {
let creation_flags = CreationFlags::from_bits_truncate(flags); let creation_flags = CreationFlags::from_bits_truncate(flags);

@ -39,18 +39,18 @@ impl FsView {
} }
/// Open a file on the process. But DO NOT add it to file table. /// Open a file on the process. But DO NOT add it to file table.
pub fn open_file(&self, path: &str, flags: u32, mode: u32) -> Result<Box<dyn File>> { pub fn open_file(&self, path: &str, flags: u32, mode: u32) -> Result<Arc<dyn File>> {
if path == "/dev/null" { if path == "/dev/null" {
return Ok(Box::new(DevNull)); return Ok(Arc::new(DevNull));
} }
if path == "/dev/zero" { if path == "/dev/zero" {
return Ok(Box::new(DevZero)); return Ok(Arc::new(DevZero));
} }
if path == "/dev/random" || path == "/dev/urandom" || path == "/dev/arandom" { if path == "/dev/random" || path == "/dev/urandom" || path == "/dev/arandom" {
return Ok(Box::new(DevRandom)); return Ok(Arc::new(DevRandom));
} }
if path == "/dev/sgx" { if path == "/dev/sgx" {
return Ok(Box::new(DevSgx)); return Ok(Arc::new(DevSgx));
} }
let creation_flags = CreationFlags::from_bits_truncate(flags); let creation_flags = CreationFlags::from_bits_truncate(flags);
let inode = if creation_flags.no_follow_symlink() { let inode = if creation_flags.no_follow_symlink() {
@ -113,7 +113,7 @@ impl FsView {
} }
}; };
let abs_path = self.convert_to_abs_path(&path); let abs_path = self.convert_to_abs_path(&path);
Ok(Box::new(INodeFile::open(inode, &abs_path, flags)?)) Ok(Arc::new(INodeFile::open(inode, &abs_path, flags)?))
} }
/// Recursively lookup the real path of giving path, dereference symlinks /// Recursively lookup the real path of giving path, dereference symlinks

@ -204,8 +204,8 @@ pub fn do_pipe2(flags: u32) -> Result<[FileDesc; 2]> {
let close_on_spawn = creation_flags.must_close_on_spawn(); let close_on_spawn = creation_flags.must_close_on_spawn();
let current = current!(); let current = current!();
let reader_fd = current.add_file(Arc::new(Box::new(pipe_reader)), close_on_spawn); let reader_fd = current.add_file(Arc::new(pipe_reader), close_on_spawn);
let writer_fd = current.add_file(Arc::new(Box::new(pipe_writer)), close_on_spawn); let writer_fd = current.add_file(Arc::new(pipe_writer), close_on_spawn);
trace!("pipe2: reader_fd: {}, writer_fd: {}", reader_fd, writer_fd); trace!("pipe2: reader_fd: {}, writer_fd: {}", reader_fd, writer_fd);
Ok([reader_fd, writer_fd]) Ok([reader_fd, writer_fd])
} }

@ -23,9 +23,9 @@ pub fn do_eventfd2(init_val: u32, flags: i32) -> Result<isize> {
let inner_flags = let inner_flags =
EventCreationFlags::from_bits(flags).ok_or_else(|| errno!(EINVAL, "invalid flags"))?; EventCreationFlags::from_bits(flags).ok_or_else(|| errno!(EINVAL, "invalid flags"))?;
let file_ref: Arc<Box<dyn File>> = { let file_ref: Arc<dyn File> = {
let event = EventFile::new(init_val, inner_flags)?; let event = EventFile::new(init_val, inner_flags)?;
Arc::new(Box::new(event)) Arc::new(event)
}; };
let fd = current!().add_file( let fd = current!().add_file(

@ -13,14 +13,14 @@ pub fn do_socket(domain: c_int, socket_type: c_int, protocol: c_int) -> Result<i
let file_flags = FileFlags::from_bits_truncate(socket_type); let file_flags = FileFlags::from_bits_truncate(socket_type);
let sock_type = SocketType::try_from(socket_type & (!file_flags.bits()))?; let sock_type = SocketType::try_from(socket_type & (!file_flags.bits()))?;
let file_ref: Arc<Box<dyn File>> = match sock_domain { let file_ref: Arc<dyn File> = match sock_domain {
AddressFamily::LOCAL => { AddressFamily::LOCAL => {
let unix_socket = UnixSocketFile::new(socket_type, protocol)?; let unix_socket = UnixSocketFile::new(socket_type, protocol)?;
Arc::new(Box::new(unix_socket)) Arc::new(unix_socket)
} }
_ => { _ => {
let socket = HostSocket::new(sock_domain, sock_type, file_flags, protocol)?; let socket = HostSocket::new(sock_domain, sock_type, file_flags, protocol)?;
Arc::new(Box::new(socket)) Arc::new(socket)
} }
}; };
@ -130,7 +130,7 @@ pub fn do_accept4(
let file_ref = current!().file(fd as FileDesc)?; let file_ref = current!().file(fd as FileDesc)?;
let new_fd = if let Ok(socket) = file_ref.as_host_socket() { let new_fd = if let Ok(socket) = file_ref.as_host_socket() {
let (new_socket_file, sock_addr_option) = socket.accept(file_flags)?; let (new_socket_file, sock_addr_option) = socket.accept(file_flags)?;
let new_file_ref: Arc<Box<dyn File>> = Arc::new(Box::new(new_socket_file)); let new_file_ref: Arc<dyn File> = Arc::new(new_socket_file);
let new_fd = current!().add_file(new_file_ref, close_on_spawn); let new_fd = current!().add_file(new_file_ref, close_on_spawn);
if addr_set && sock_addr_option.is_some() { if addr_set && sock_addr_option.is_some() {
@ -150,7 +150,7 @@ pub fn do_accept4(
} }
// TODO: handle addr // TODO: handle addr
let new_socket = unix_socket.accept()?; let new_socket = unix_socket.accept()?;
let new_file_ref: Arc<Box<dyn File>> = Arc::new(Box::new(new_socket)); let new_file_ref: Arc<dyn File> = Arc::new(new_socket);
current!().add_file(new_file_ref, false) current!().add_file(new_file_ref, false)
} else { } else {
return_errno!(EBADF, "not a socket"); return_errno!(EBADF, "not a socket");
@ -385,8 +385,8 @@ pub fn do_socketpair(
let current = current!(); let current = current!();
let mut files = current.files().lock().unwrap(); let mut files = current.files().lock().unwrap();
sock_pair[0] = files.put(Arc::new(Box::new(client_socket)), close_on_spawn); sock_pair[0] = files.put(Arc::new(client_socket), close_on_spawn);
sock_pair[1] = files.put(Arc::new(Box::new(server_socket)), close_on_spawn); sock_pair[1] = files.put(Arc::new(server_socket), close_on_spawn);
debug!("socketpair: ({}, {})", sock_pair[0], sock_pair[1]); debug!("socketpair: ({}, {})", sock_pair[0], sock_pair[1]);
Ok(0) Ok(0)
@ -616,7 +616,7 @@ pub fn do_epoll_create1(raw_flags: c_int) -> Result<isize> {
.ok_or_else(|| errno!(EINVAL, "invalid flags"))? .ok_or_else(|| errno!(EINVAL, "invalid flags"))?
& CreationFlags::O_CLOEXEC; & CreationFlags::O_CLOEXEC;
let epoll_file = io_multiplexing::EpollFile::new(flags)?; let epoll_file = io_multiplexing::EpollFile::new(flags)?;
let file_ref: Arc<Box<dyn File>> = Arc::new(Box::new(epoll_file)); let file_ref: Arc<dyn File> = Arc::new(epoll_file);
let close_on_spawn = flags.contains(CreationFlags::O_CLOEXEC); let close_on_spawn = flags.contains(CreationFlags::O_CLOEXEC);
let fd = current!().add_file(file_ref, close_on_spawn); let fd = current!().add_file(file_ref, close_on_spawn);

@ -244,13 +244,12 @@ fn init_files(
oflag, oflag,
fd, fd,
} => { } => {
let file = let file_ref =
current_ref current_ref
.fs() .fs()
.lock() .lock()
.unwrap() .unwrap()
.open_file(path.as_str(), oflag, mode)?; .open_file(path.as_str(), oflag, mode)?;
let file_ref: Arc<Box<dyn File>> = Arc::new(file);
let creation_flags = CreationFlags::from_bits_truncate(oflag); let creation_flags = CreationFlags::from_bits_truncate(oflag);
cloned_file_table.put_at(fd, file_ref, creation_flags.must_close_on_spawn()); cloned_file_table.put_at(fd, file_ref, creation_flags.must_close_on_spawn());
} }
@ -273,15 +272,14 @@ fn init_files(
// But, for init process, we initialize file table for it // But, for init process, we initialize file table for it
let mut file_table = FileTable::new(); let mut file_table = FileTable::new();
let stdin: Arc<Box<dyn File>> = Arc::new(Box::new(StdinFile::new( let stdin: Arc<dyn File> =
host_stdio_fds.unwrap().stdin_fd as FileDesc, Arc::new(StdinFile::new(host_stdio_fds.unwrap().stdin_fd as FileDesc));
))); let stdout: Arc<dyn File> = Arc::new(StdoutFile::new(
let stdout: Arc<Box<dyn File>> = Arc::new(Box::new(StdoutFile::new(
host_stdio_fds.unwrap().stdout_fd as FileDesc, host_stdio_fds.unwrap().stdout_fd as FileDesc,
))); ));
let stderr: Arc<Box<dyn File>> = Arc::new(Box::new(StdoutFile::new( let stderr: Arc<dyn File> = Arc::new(StdoutFile::new(
host_stdio_fds.unwrap().stderr_fd as FileDesc, host_stdio_fds.unwrap().stderr_fd as FileDesc,
))); ));
file_table.put(stdin, false); file_table.put(stdin, false);
file_table.put(stdout, false); file_table.put(stdout, false);