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:
parent
6e83595b74
commit
2ff4b1c776
@ -106,7 +106,7 @@ pub trait File: Debug + Sync + Send + Any {
|
||||
fn as_any(&self) -> &dyn Any;
|
||||
}
|
||||
|
||||
pub type FileRef = Arc<Box<dyn File>>;
|
||||
pub type FileRef = Arc<dyn File>;
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
struct FileOpNotSupportedError {
|
||||
|
@ -10,8 +10,7 @@ pub fn do_openat(fs_path: &FsPath, flags: u32, mode: u32) -> Result<FileDesc> {
|
||||
let current = current!();
|
||||
let fs = current.fs().lock().unwrap();
|
||||
|
||||
let file = fs.open_file(&path, flags, mode)?;
|
||||
let file_ref: Arc<Box<dyn File>> = Arc::new(file);
|
||||
let file_ref: Arc<dyn File> = fs.open_file(&path, flags, mode)?;
|
||||
|
||||
let fd = {
|
||||
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.
|
||||
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" {
|
||||
return Ok(Box::new(DevNull));
|
||||
return Ok(Arc::new(DevNull));
|
||||
}
|
||||
if path == "/dev/zero" {
|
||||
return Ok(Box::new(DevZero));
|
||||
return Ok(Arc::new(DevZero));
|
||||
}
|
||||
if path == "/dev/random" || path == "/dev/urandom" || path == "/dev/arandom" {
|
||||
return Ok(Box::new(DevRandom));
|
||||
return Ok(Arc::new(DevRandom));
|
||||
}
|
||||
if path == "/dev/sgx" {
|
||||
return Ok(Box::new(DevSgx));
|
||||
return Ok(Arc::new(DevSgx));
|
||||
}
|
||||
let creation_flags = CreationFlags::from_bits_truncate(flags);
|
||||
let inode = if creation_flags.no_follow_symlink() {
|
||||
@ -113,7 +113,7 @@ impl FsView {
|
||||
}
|
||||
};
|
||||
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
|
||||
|
@ -204,8 +204,8 @@ pub fn do_pipe2(flags: u32) -> Result<[FileDesc; 2]> {
|
||||
let close_on_spawn = creation_flags.must_close_on_spawn();
|
||||
|
||||
let current = current!();
|
||||
let reader_fd = current.add_file(Arc::new(Box::new(pipe_reader)), close_on_spawn);
|
||||
let writer_fd = current.add_file(Arc::new(Box::new(pipe_writer)), close_on_spawn);
|
||||
let reader_fd = current.add_file(Arc::new(pipe_reader), 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);
|
||||
Ok([reader_fd, writer_fd])
|
||||
}
|
||||
|
@ -23,9 +23,9 @@ pub fn do_eventfd2(init_val: u32, flags: i32) -> Result<isize> {
|
||||
|
||||
let inner_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)?;
|
||||
Arc::new(Box::new(event))
|
||||
Arc::new(event)
|
||||
};
|
||||
|
||||
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 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 => {
|
||||
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)?;
|
||||
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 new_fd = if let Ok(socket) = file_ref.as_host_socket() {
|
||||
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);
|
||||
|
||||
if addr_set && sock_addr_option.is_some() {
|
||||
@ -150,7 +150,7 @@ pub fn do_accept4(
|
||||
}
|
||||
// TODO: handle addr
|
||||
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)
|
||||
} else {
|
||||
return_errno!(EBADF, "not a socket");
|
||||
@ -385,8 +385,8 @@ pub fn do_socketpair(
|
||||
|
||||
let current = current!();
|
||||
let mut files = current.files().lock().unwrap();
|
||||
sock_pair[0] = files.put(Arc::new(Box::new(client_socket)), close_on_spawn);
|
||||
sock_pair[1] = files.put(Arc::new(Box::new(server_socket)), close_on_spawn);
|
||||
sock_pair[0] = files.put(Arc::new(client_socket), close_on_spawn);
|
||||
sock_pair[1] = files.put(Arc::new(server_socket), close_on_spawn);
|
||||
|
||||
debug!("socketpair: ({}, {})", sock_pair[0], sock_pair[1]);
|
||||
Ok(0)
|
||||
@ -616,7 +616,7 @@ pub fn do_epoll_create1(raw_flags: c_int) -> Result<isize> {
|
||||
.ok_or_else(|| errno!(EINVAL, "invalid flags"))?
|
||||
& CreationFlags::O_CLOEXEC;
|
||||
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 fd = current!().add_file(file_ref, close_on_spawn);
|
||||
|
||||
|
@ -244,13 +244,12 @@ fn init_files(
|
||||
oflag,
|
||||
fd,
|
||||
} => {
|
||||
let file =
|
||||
let file_ref =
|
||||
current_ref
|
||||
.fs()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.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);
|
||||
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
|
||||
let mut file_table = FileTable::new();
|
||||
let stdin: Arc<Box<dyn File>> = Arc::new(Box::new(StdinFile::new(
|
||||
host_stdio_fds.unwrap().stdin_fd as FileDesc,
|
||||
)));
|
||||
let stdout: Arc<Box<dyn File>> = Arc::new(Box::new(StdoutFile::new(
|
||||
let stdin: Arc<dyn File> =
|
||||
Arc::new(StdinFile::new(host_stdio_fds.unwrap().stdin_fd as FileDesc));
|
||||
let stdout: Arc<dyn File> = Arc::new(StdoutFile::new(
|
||||
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,
|
||||
)));
|
||||
));
|
||||
|
||||
file_table.put(stdin, false);
|
||||
file_table.put(stdout, false);
|
||||
|
Loading…
Reference in New Issue
Block a user