use crate::{
disk::tokio_impl::{AsyncDiskMmapFile, AsyncDiskMmapFileMut},
empty::tokio_impl::AsyncEmptyMmapFile,
error::{Error, ErrorKind, Result},
memory::tokio_impl::{AsyncMemoryMmapFile, AsyncMemoryMmapFileMut},
metadata::MetaData,
tokio::{AsyncMmapFileReader, AsyncMmapFileWriter, AsyncOptions},
utils::tokio::sync_dir_async,
};
use std::{
borrow::Cow,
io::Cursor,
mem,
path::{Path, PathBuf},
};
use tokio::io::AsyncWriteExt;
async fn run_blocking_io<F, T>(f: F) -> T
where
F: FnOnce() -> T + Send + 'static,
T: Send + 'static,
{
match tokio::task::spawn_blocking(f).await {
Ok(r) => r,
Err(e) => std::panic::resume_unwind(e.into_panic()),
}
}
#[cfg(unix)]
async fn extract_pin_or_err(
file: ::tokio::fs::File,
) -> std::result::Result<std::fs::File, (::tokio::fs::File, Error)> {
Ok(file.into_std().await)
}
#[cfg(unix)]
fn sync_drop_pin(file: ::tokio::fs::File) -> Option<std::fs::File> {
match file.try_into_std() {
Ok(std_file) => Some(std_file),
Err(orig) => {
use std::os::fd::{AsRawFd, BorrowedFd};
let raw = orig.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: ::tokio::fs::File) -> Option<std::fs::File> {
drop(file);
None
}
declare_async_mmap_file_ext!(
AsyncDiskMmapFileMut,
AsyncOptions,
AsyncMmapFileReader<'_>,
::tokio::fs::OpenOptions
);
declare_async_mmap_file_mut_ext!(AsyncMmapFileWriter<'_>);
declare_and_impl_inners!();
declare_and_impl_async_mmap_file!("tokio_async", "tokio_test", "tokio");
delcare_and_impl_async_mmap_file_mut!("tokio_async", "tokio_test", "tokio");
impl_async_tests!(
"tokio_async",
tokio::test,
tokio,
AsyncMmapFile,
AsyncMmapFileMut
);