use std::fs::File;
use std::io;
use std::os::unix::io::AsRawFd;
#[cfg(target_os = "linux")]
pub fn fdatasync(file: &File) -> io::Result<()> {
let rc = unsafe { libc::fdatasync(file.as_raw_fd()) };
if rc == 0 {
Ok(())
} else {
Err(io::Error::last_os_error())
}
}
#[cfg(not(target_os = "linux"))]
pub fn fdatasync(file: &File) -> io::Result<()> {
file.sync_data()
}
#[cfg(any(target_os = "linux", target_os = "macos"))]
pub fn sync_dir(dir: &File) -> io::Result<()> {
let rc = unsafe { libc::fsync(dir.as_raw_fd()) };
if rc == 0 {
Ok(())
} else {
Err(io::Error::last_os_error())
}
}
#[cfg(windows)]
pub fn sync_dir(_dir: &File) -> io::Result<()> {
Ok(())
}
#[inline]
pub fn clock_realtime_coarse_ns() -> u64 {
let mut ts = libc::timespec {
tv_sec: 0,
tv_nsec: 0,
};
unsafe {
libc::clock_gettime(libc::CLOCK_REALTIME_COARSE, &mut ts);
}
(ts.tv_sec as u64)
.saturating_mul(1_000_000_000)
.saturating_add(ts.tv_nsec as u64)
}
pub fn is_enospc(err: &io::Error) -> bool {
err.raw_os_error() == Some(libc::ENOSPC)
}