Line data Source code
1 : //! Enum-dispatch to the `OpenOptions` type of the respective [`super::IoEngineKind`];
2 :
3 : use super::io_engine::IoEngine;
4 : use std::{os::fd::OwnedFd, path::Path};
5 :
6 : #[derive(Debug, Clone)]
7 : pub enum OpenOptions {
8 : StdFs(std::fs::OpenOptions),
9 : #[cfg(target_os = "linux")]
10 : TokioEpollUring(tokio_epoll_uring::ops::open_at::OpenOptions),
11 : }
12 :
13 : impl Default for OpenOptions {
14 12686 : fn default() -> Self {
15 12686 : match super::io_engine::get() {
16 0 : IoEngine::NotSet => panic!("io engine not set"),
17 6336 : IoEngine::StdFs => Self::StdFs(std::fs::OpenOptions::new()),
18 : #[cfg(target_os = "linux")]
19 : IoEngine::TokioEpollUring => {
20 6350 : Self::TokioEpollUring(tokio_epoll_uring::ops::open_at::OpenOptions::new())
21 : }
22 : }
23 12686 : }
24 : }
25 :
26 : impl OpenOptions {
27 12686 : pub fn new() -> OpenOptions {
28 12686 : Self::default()
29 12686 : }
30 :
31 8444 : pub fn read(&mut self, read: bool) -> &mut OpenOptions {
32 8444 : match self {
33 4222 : OpenOptions::StdFs(x) => {
34 4222 : let _ = x.read(read);
35 4222 : }
36 : #[cfg(target_os = "linux")]
37 4222 : OpenOptions::TokioEpollUring(x) => {
38 4222 : let _ = x.read(read);
39 4222 : }
40 : }
41 8444 : self
42 8444 : }
43 :
44 6862 : pub fn write(&mut self, write: bool) -> &mut OpenOptions {
45 6862 : match self {
46 3424 : OpenOptions::StdFs(x) => {
47 3424 : let _ = x.write(write);
48 3424 : }
49 : #[cfg(target_os = "linux")]
50 3438 : OpenOptions::TokioEpollUring(x) => {
51 3438 : let _ = x.write(write);
52 3438 : }
53 : }
54 6862 : self
55 6862 : }
56 :
57 17968 : pub fn create(&mut self, create: bool) -> &mut OpenOptions {
58 17968 : match self {
59 8970 : OpenOptions::StdFs(x) => {
60 8970 : let _ = x.create(create);
61 8970 : }
62 : #[cfg(target_os = "linux")]
63 8998 : OpenOptions::TokioEpollUring(x) => {
64 8998 : let _ = x.create(create);
65 8998 : }
66 : }
67 17968 : self
68 17968 : }
69 :
70 13442 : pub fn create_new(&mut self, create_new: bool) -> &mut OpenOptions {
71 13442 : match self {
72 6714 : OpenOptions::StdFs(x) => {
73 6714 : let _ = x.create_new(create_new);
74 6714 : }
75 : #[cfg(target_os = "linux")]
76 6728 : OpenOptions::TokioEpollUring(x) => {
77 6728 : let _ = x.create_new(create_new);
78 6728 : }
79 : }
80 13442 : self
81 13442 : }
82 :
83 15356 : pub fn truncate(&mut self, truncate: bool) -> &mut OpenOptions {
84 15356 : match self {
85 7664 : OpenOptions::StdFs(x) => {
86 7664 : let _ = x.truncate(truncate);
87 7664 : }
88 : #[cfg(target_os = "linux")]
89 7692 : OpenOptions::TokioEpollUring(x) => {
90 7692 : let _ = x.truncate(truncate);
91 7692 : }
92 : }
93 15356 : self
94 15356 : }
95 :
96 391545 : pub(in crate::virtual_file) async fn open(&self, path: &Path) -> std::io::Result<OwnedFd> {
97 391545 : match self {
98 197200 : OpenOptions::StdFs(x) => x.open(path).map(|file| file.into()),
99 : #[cfg(target_os = "linux")]
100 194345 : OpenOptions::TokioEpollUring(x) => {
101 194345 : let system = super::io_engine::tokio_epoll_uring_ext::thread_local_system().await;
102 194345 : system.open(path, x).await.map_err(|e| match e {
103 0 : tokio_epoll_uring::Error::Op(e) => e,
104 0 : tokio_epoll_uring::Error::System(system) => {
105 0 : std::io::Error::new(std::io::ErrorKind::Other, system)
106 : }
107 194345 : })
108 : }
109 : }
110 391545 : }
111 : }
112 :
113 : impl std::os::unix::prelude::OpenOptionsExt for OpenOptions {
114 0 : fn mode(&mut self, mode: u32) -> &mut OpenOptions {
115 0 : match self {
116 0 : OpenOptions::StdFs(x) => {
117 0 : let _ = x.mode(mode);
118 0 : }
119 : #[cfg(target_os = "linux")]
120 0 : OpenOptions::TokioEpollUring(x) => {
121 0 : let _ = x.mode(mode);
122 0 : }
123 : }
124 0 : self
125 0 : }
126 :
127 0 : fn custom_flags(&mut self, flags: i32) -> &mut OpenOptions {
128 0 : match self {
129 0 : OpenOptions::StdFs(x) => {
130 0 : let _ = x.custom_flags(flags);
131 0 : }
132 : #[cfg(target_os = "linux")]
133 0 : OpenOptions::TokioEpollUring(x) => {
134 0 : let _ = x.custom_flags(flags);
135 0 : }
136 : }
137 0 : self
138 0 : }
139 : }
|