From 7c8355972b357a6407a1bf9b799695a8d186e6fd Mon Sep 17 00:00:00 2001 From: Marcin Mielniczuk Date: Thu, 25 Jul 2019 16:51:18 +0200 Subject: [PATCH] Reuse Metadata if possible to save syscalls. --- src/hostcalls_impl/fs.rs | 10 +++++----- src/sys/unix/hostcalls_impl/fs.rs | 23 +++++++++++------------ src/sys/windows/hostcalls_impl/fs.rs | 14 +++++++------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/hostcalls_impl/fs.rs b/src/hostcalls_impl/fs.rs index 8ef153a..c4c96a5 100644 --- a/src/hostcalls_impl/fs.rs +++ b/src/hostcalls_impl/fs.rs @@ -756,9 +756,9 @@ fn fd_filestat_get_impl(file: &std::fs::File) -> Result let metadata = file.metadata().map_err(convert_err)?; Ok(host::__wasi_filestat_t { - st_dev: hostcalls_impl::device_id(file).map_err(convert_err)?, - st_ino: hostcalls_impl::file_serial_no(file).map_err(convert_err)?, - st_nlink: hostcalls_impl::num_hardlinks(file) + st_dev: hostcalls_impl::device_id(file, &metadata).map_err(convert_err)?, + st_ino: hostcalls_impl::file_serial_no(file, &metadata).map_err(convert_err)?, + st_nlink: hostcalls_impl::num_hardlinks(file, &metadata) .map_err(convert_err)? .try_into() .map_err(|_| host::__WASI_EOVERFLOW)?, // u64 doesn't fit into u32 @@ -767,7 +767,7 @@ fn fd_filestat_get_impl(file: &std::fs::File) -> Result .accessed() .map_err(convert_err) .and_then(timestamp)?, - st_ctim: hostcalls_impl::change_time(file) + st_ctim: hostcalls_impl::change_time(file, &metadata) .map_err(convert_err)? .try_into() .map_err(|_| host::__WASI_EOVERFLOW)?, // i64 doesn't fit into u64 @@ -775,7 +775,7 @@ fn fd_filestat_get_impl(file: &std::fs::File) -> Result .modified() .map_err(convert_err) .and_then(timestamp)?, - st_filetype: hostcalls_impl::filetype(file).map_err(convert_err)?, + st_filetype: hostcalls_impl::filetype(&metadata).map_err(convert_err)?, }) } diff --git a/src/sys/unix/hostcalls_impl/fs.rs b/src/sys/unix/hostcalls_impl/fs.rs index 89975e3..a0b0a9f 100644 --- a/src/sys/unix/hostcalls_impl/fs.rs +++ b/src/sys/unix/hostcalls_impl/fs.rs @@ -9,7 +9,7 @@ use crate::sys::host_impl; use crate::{host, wasm32, Result}; use nix::libc::{self, c_long, c_void, off_t}; use std::ffi::CString; -use std::fs::File; +use std::fs::{File, Metadata}; use std::io; use std::os::unix::fs::FileExt; use std::os::unix::prelude::{AsRawFd, FromRawFd}; @@ -357,24 +357,24 @@ pub(crate) fn path_rename( } } -pub(crate) fn num_hardlinks(file: &File) -> io::Result { +pub(crate) fn num_hardlinks(_file: &File, metadata: &Metadata) -> io::Result { use std::os::unix::fs::MetadataExt; - Ok(file.metadata()?.nlink()) + Ok(metadata.nlink()) } -pub(crate) fn device_id(file: &File) -> io::Result { +pub(crate) fn device_id(_file: &File, metadata: &Metadata) -> io::Result { use std::os::unix::fs::MetadataExt; - Ok(file.metadata()?.dev()) + Ok(metadata.dev()) } -pub(crate) fn file_serial_no(file: &File) -> io::Result { +pub(crate) fn file_serial_no(_file: &File, metadata: &Metadata) -> io::Result { use std::os::unix::fs::MetadataExt; - Ok(file.metadata()?.ino()) + Ok(metadata.ino()) } -pub(crate) fn filetype(file: &File) -> io::Result { +pub(crate) fn filetype(metadata: &Metadata) -> io::Result { use std::os::unix::fs::FileTypeExt; - let ftype = file.metadata()?.file_type(); + let ftype = metadata.file_type(); let ret = if ftype.is_file() { host::__WASI_FILETYPE_REGULAR_FILE } else if ftype.is_dir() { @@ -396,10 +396,9 @@ pub(crate) fn filetype(file: &File) -> io::Result { Ok(ret) } -pub(crate) fn change_time(file: &File) -> io::Result { - use std::convert::TryInto; +pub(crate) fn change_time(_file: &File, metadata: &Metadata) -> io::Result { use std::os::unix::fs::MetadataExt; - Ok(file.metadata()?.ctime()) + Ok(metadata.ctime()) } pub(crate) fn fd_filestat_set_times( diff --git a/src/sys/windows/hostcalls_impl/fs.rs b/src/sys/windows/hostcalls_impl/fs.rs index 5f161f4..abbebaa 100644 --- a/src/sys/windows/hostcalls_impl/fs.rs +++ b/src/sys/windows/hostcalls_impl/fs.rs @@ -7,7 +7,7 @@ use crate::sys::errno_from_host; use crate::sys::fdentry_impl::determine_type_rights; use crate::sys::host_impl; use crate::{host, Result}; -use std::fs::File; +use std::fs::{File, Metadata}; use std::io::{self, Seek, SeekFrom}; use std::os::windows::fs::FileExt; use std::os::windows::prelude::{AsRawHandle, FromRawHandle}; @@ -173,15 +173,15 @@ pub(crate) fn path_rename( unimplemented!("path_rename") } -pub(crate) fn num_hardlinks(file: &File) -> io::Result { +pub(crate) fn num_hardlinks(file: &File, _metadata: &Metadata) -> io::Result { Ok(winx::file::get_fileinfo(file)?.nNumberOfLinks.into()) } -pub(crate) fn device_id(file: &File) -> io::Result { +pub(crate) fn device_id(file: &File, _metadata: &Metadata) -> io::Result { Ok(winx::file::get_fileinfo(file)?.dwVolumeSerialNumber.into()) } -pub(crate) fn file_serial_no(file: &File) -> io::Result { +pub(crate) fn file_serial_no(file: &File, _metadata: &Metadata) -> io::Result { let info = winx::file::get_fileinfo(file)?; let high = info.nFileIndexHigh; let low = info.nFileIndexLow; @@ -189,12 +189,12 @@ pub(crate) fn file_serial_no(file: &File) -> io::Result { Ok(no) } -pub(crate) fn change_time(file: &File) -> io::Result { +pub(crate) fn change_time(file: &File, _metadata: &Metadata) -> io::Result { winx::file::change_time(file) } -pub(crate) fn filetype(file: &File) -> io::Result { - let ftype = file.metadata()?.file_type(); +pub(crate) fn filetype(metadata: &Metadata) -> io::Result { + let ftype = metadata.file_type(); let ret = if ftype.is_file() { host::__WASI_FILETYPE_REGULAR_FILE } else if ftype.is_dir() {