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 12666 : fn default() -> Self {
17 12666 : match super::io_engine::get() {
18 0 : IoEngine::NotSet => panic!("io engine not set"),
19 6326 : IoEngine::StdFs => Self::StdFs(std::fs::OpenOptions::new()),
20 : #[cfg(target_os = "linux")]
21 : IoEngine::TokioEpollUring => {
22 6340 : Self::TokioEpollUring(tokio_epoll_uring::ops::open_at::OpenOptions::new())
23 : }
24 : }
25 12666 : }
26 : }
27 :
28 : impl OpenOptions {
29 12666 : pub fn new() -> OpenOptions {
30 12666 : Self::default()
31 12666 : }
32 :
33 8424 : pub fn read(&mut self, read: bool) -> &mut OpenOptions {
34 8424 : match self {
35 4212 : OpenOptions::StdFs(x) => {
36 4212 : let _ = x.read(read);
37 4212 : }
38 : #[cfg(target_os = "linux")]
39 4212 : OpenOptions::TokioEpollUring(x) => {
40 4212 : let _ = x.read(read);
41 4212 : }
42 : }
43 8424 : self
44 8424 : }
45 :
46 6882 : pub fn write(&mut self, write: bool) -> &mut OpenOptions {
47 6882 : match self {
48 3434 : OpenOptions::StdFs(x) => {
49 3434 : let _ = x.write(write);
50 3434 : }
51 : #[cfg(target_os = "linux")]
52 3448 : OpenOptions::TokioEpollUring(x) => {
53 3448 : let _ = x.write(write);
54 3448 : }
55 : }
56 6882 : self
57 6882 : }
58 :
59 17932 : pub fn create(&mut self, create: bool) -> &mut OpenOptions {
60 17932 : match self {
61 8952 : OpenOptions::StdFs(x) => {
62 8952 : let _ = x.create(create);
63 8952 : }
64 : #[cfg(target_os = "linux")]
65 8980 : OpenOptions::TokioEpollUring(x) => {
66 8980 : let _ = x.create(create);
67 8980 : }
68 : }
69 17932 : self
70 17932 : }
71 :
72 13458 : pub fn create_new(&mut self, create_new: bool) -> &mut OpenOptions {
73 13458 : match self {
74 6722 : OpenOptions::StdFs(x) => {
75 6722 : let _ = x.create_new(create_new);
76 6722 : }
77 : #[cfg(target_os = "linux")]
78 6736 : OpenOptions::TokioEpollUring(x) => {
79 6736 : let _ = x.create_new(create_new);
80 6736 : }
81 : }
82 13458 : self
83 13458 : }
84 :
85 15300 : pub fn truncate(&mut self, truncate: bool) -> &mut OpenOptions {
86 15300 : match self {
87 7636 : OpenOptions::StdFs(x) => {
88 7636 : let _ = x.truncate(truncate);
89 7636 : }
90 : #[cfg(target_os = "linux")]
91 7664 : OpenOptions::TokioEpollUring(x) => {
92 7664 : let _ = x.truncate(truncate);
93 7664 : }
94 : }
95 15300 : self
96 15300 : }
97 :
98 387667 : pub(in crate::virtual_file) async fn open(&self, path: &Path) -> std::io::Result<OwnedFd> {
99 387667 : match self {
100 194709 : OpenOptions::StdFs(x) => x.open(path).map(|file| file.into()),
101 : #[cfg(target_os = "linux")]
102 192958 : OpenOptions::TokioEpollUring(x) => {
103 192958 : let system = super::io_engine::tokio_epoll_uring_ext::thread_local_system().await;
104 192958 : 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 192958 : })
110 : }
111 : }
112 387667 : }
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 : }
|