use std::{
borrow::Cow,
mem,
path::{Path, PathBuf},
};
use crate::{
disk::smol_impl::{AsyncDiskMmapFile, AsyncDiskMmapFileMut},
empty::smol_impl::AsyncEmptyMmapFile,
error::{Error, ErrorKind, Result},
memory::smol_impl::{AsyncMemoryMmapFile, AsyncMemoryMmapFileMut},
metadata::MetaData,
smol::{AsyncMmapFileReader, AsyncMmapFileWriter, AsyncOptions},
utils::smol::sync_dir_async,
};
use smol::io::{AsyncWriteExt, Cursor};
async fn run_blocking_io<F, T>(f: F) -> T
where
F: FnOnce() -> T + Send + 'static,
T: Send + 'static,
{
smol::unblock(f).await
}
#[cfg(unix)]
async fn extract_pin_or_err(
file: ::smol::fs::File,
) -> std::result::Result<std::fs::File, (::smol::fs::File, Error)> {
use std::os::fd::{AsRawFd, BorrowedFd};
let raw = file.as_raw_fd();
let borrowed = unsafe { BorrowedFd::borrow_raw(raw) };
match rustix::io::fcntl_dupfd_cloexec(borrowed, 0) {
Ok(owned) => {
drop(file);
Ok(std::fs::File::from(owned))
}
Err(e) => Err((file, std::io::Error::from(e))),
}
}
#[cfg(unix)]
fn sync_drop_pin(file: ::smol::fs::File) -> Option<std::fs::File> {
use std::os::fd::{AsRawFd, BorrowedFd};
let raw = file.as_raw_fd();
let borrowed = unsafe { BorrowedFd::borrow_raw(raw) };
rustix::io::fcntl_dupfd_cloexec(borrowed, 0)
.ok()
.map(std::fs::File::from)
}
#[cfg(not(unix))]
fn sync_drop_pin(file: ::smol::fs::File) -> Option<std::fs::File> {
drop(file);
None
}
declare_async_mmap_file_ext!(
AsyncDiskMmapFileMut,
AsyncOptions,
AsyncMmapFileReader<'_>,
::smol::fs::OpenOptions
);
declare_async_mmap_file_mut_ext!(AsyncMmapFileWriter<'_>);
declare_and_impl_inners!();
declare_and_impl_async_mmap_file!("smol_async", "smol", "smol");
delcare_and_impl_async_mmap_file_mut!("smol_async", "smol", "smol");
impl_async_tests!(
"smol_async",
smol_potat::test,
smol,
AsyncMmapFile,
AsyncMmapFileMut
);