Skip to content
This repository has been archived by the owner on Nov 9, 2019. It is now read-only.

Commit

Permalink
Reuse Metadata if possible to save syscalls.
Browse files Browse the repository at this point in the history
  • Loading branch information
marmistrz committed Jul 25, 2019
1 parent eb807a3 commit 7c83559
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 24 deletions.
10 changes: 5 additions & 5 deletions src/hostcalls_impl/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -756,9 +756,9 @@ fn fd_filestat_get_impl(file: &std::fs::File) -> Result<host::__wasi_filestat_t>

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
Expand All @@ -767,15 +767,15 @@ fn fd_filestat_get_impl(file: &std::fs::File) -> Result<host::__wasi_filestat_t>
.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
st_mtim: metadata
.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)?,
})
}

Expand Down
23 changes: 11 additions & 12 deletions src/sys/unix/hostcalls_impl/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -357,24 +357,24 @@ pub(crate) fn path_rename(
}
}

pub(crate) fn num_hardlinks(file: &File) -> io::Result<u64> {
pub(crate) fn num_hardlinks(_file: &File, metadata: &Metadata) -> io::Result<u64> {
use std::os::unix::fs::MetadataExt;
Ok(file.metadata()?.nlink())
Ok(metadata.nlink())
}

pub(crate) fn device_id(file: &File) -> io::Result<u64> {
pub(crate) fn device_id(_file: &File, metadata: &Metadata) -> io::Result<u64> {
use std::os::unix::fs::MetadataExt;
Ok(file.metadata()?.dev())
Ok(metadata.dev())
}

pub(crate) fn file_serial_no(file: &File) -> io::Result<u64> {
pub(crate) fn file_serial_no(_file: &File, metadata: &Metadata) -> io::Result<u64> {
use std::os::unix::fs::MetadataExt;
Ok(file.metadata()?.ino())
Ok(metadata.ino())
}

pub(crate) fn filetype(file: &File) -> io::Result<host::__wasi_filetype_t> {
pub(crate) fn filetype(metadata: &Metadata) -> io::Result<host::__wasi_filetype_t> {
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() {
Expand All @@ -396,10 +396,9 @@ pub(crate) fn filetype(file: &File) -> io::Result<host::__wasi_filetype_t> {
Ok(ret)
}

pub(crate) fn change_time(file: &File) -> io::Result<i64> {
use std::convert::TryInto;
pub(crate) fn change_time(_file: &File, metadata: &Metadata) -> io::Result<i64> {
use std::os::unix::fs::MetadataExt;
Ok(file.metadata()?.ctime())
Ok(metadata.ctime())
}

pub(crate) fn fd_filestat_set_times(
Expand Down
14 changes: 7 additions & 7 deletions src/sys/windows/hostcalls_impl/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -173,28 +173,28 @@ pub(crate) fn path_rename(
unimplemented!("path_rename")
}

pub(crate) fn num_hardlinks(file: &File) -> io::Result<u64> {
pub(crate) fn num_hardlinks(file: &File, _metadata: &Metadata) -> io::Result<u64> {
Ok(winx::file::get_fileinfo(file)?.nNumberOfLinks.into())
}

pub(crate) fn device_id(file: &File) -> io::Result<u64> {
pub(crate) fn device_id(file: &File, _metadata: &Metadata) -> io::Result<u64> {
Ok(winx::file::get_fileinfo(file)?.dwVolumeSerialNumber.into())
}

pub(crate) fn file_serial_no(file: &File) -> io::Result<u64> {
pub(crate) fn file_serial_no(file: &File, _metadata: &Metadata) -> io::Result<u64> {
let info = winx::file::get_fileinfo(file)?;
let high = info.nFileIndexHigh;
let low = info.nFileIndexLow;
let no = ((high as u64) << 32) | (low as u64);
Ok(no)
}

pub(crate) fn change_time(file: &File) -> io::Result<i64> {
pub(crate) fn change_time(file: &File, _metadata: &Metadata) -> io::Result<i64> {
winx::file::change_time(file)
}

pub(crate) fn filetype(file: &File) -> io::Result<host::__wasi_filetype_t> {
let ftype = file.metadata()?.file_type();
pub(crate) fn filetype(metadata: &Metadata) -> io::Result<host::__wasi_filetype_t> {
let ftype = metadata.file_type();
let ret = if ftype.is_file() {
host::__WASI_FILETYPE_REGULAR_FILE
} else if ftype.is_dir() {
Expand Down

0 comments on commit 7c83559

Please sign in to comment.