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