1
- use std:: ffi:: CString ;
1
+ use std:: { ffi:: CString , hint :: unreachable_unchecked } ;
2
2
3
3
use compio_buf:: { IntoInner , IoBuf , IoBufMut , IoVectoredBuf , IoVectoredBufMut } ;
4
4
use socket2:: SockAddr ;
@@ -10,24 +10,39 @@ macro_rules! op {
10
10
( <$( $ty: ident: $trait: ident) ,* $( , ) ?> $name: ident( $( $arg: ident: $arg_t: ty) ,* $( , ) ? ) ) => {
11
11
:: paste:: paste!{
12
12
enum [ < $name Inner >] <$( $ty: $trait) ,* > {
13
+ Uninit ( $( $arg_t) ,* ) ,
13
14
Poll ( poll:: $name<$( $ty) ,* >) ,
14
15
IoUring ( iour:: $name<$( $ty) ,* >) ,
15
16
}
16
17
17
18
impl <$( $ty: $trait) ,* > [ < $name Inner >] <$( $ty) ,* > {
18
19
fn poll( & mut self ) -> & mut poll:: $name<$( $ty) ,* > {
19
- debug_assert!( DriverType :: current( ) == DriverType :: Poll ) ;
20
-
21
20
match self {
21
+ Self :: Uninit ( ..) => {
22
+ unsafe {
23
+ let Self :: Uninit ( $( $arg) ,* ) = std:: ptr:: read( self ) else {
24
+ unreachable_unchecked( )
25
+ } ;
26
+ std:: ptr:: write( self , Self :: Poll ( poll:: $name:: new( $( $arg) ,* ) ) ) ;
27
+ }
28
+ self . poll( )
29
+ } ,
22
30
Self :: Poll ( ref mut op) => op,
23
31
Self :: IoUring ( _) => unreachable!( "Current driver is not `io-uring`" ) ,
24
32
}
25
33
}
26
34
27
35
fn iour( & mut self ) -> & mut iour:: $name<$( $ty) ,* > {
28
- debug_assert!( DriverType :: current( ) == DriverType :: IoUring ) ;
29
-
30
36
match self {
37
+ Self :: Uninit ( ..) => {
38
+ unsafe {
39
+ let Self :: Uninit ( $( $arg) ,* ) = std:: ptr:: read( self ) else {
40
+ unreachable_unchecked( )
41
+ } ;
42
+ std:: ptr:: write( self , Self :: IoUring ( iour:: $name:: new( $( $arg) ,* ) ) ) ;
43
+ }
44
+ self . iour( )
45
+ } ,
31
46
Self :: IoUring ( ref mut op) => op,
32
47
Self :: Poll ( _) => unreachable!( "Current driver is not `polling`" ) ,
33
48
}
@@ -42,8 +57,12 @@ macro_rules! op {
42
57
impl <$( $ty: $trait) ,* > IntoInner for $name <$( $ty) ,* > {
43
58
type Inner = <poll:: $name<$( $ty) ,* > as IntoInner >:: Inner ;
44
59
45
- fn into_inner( self ) -> Self :: Inner {
60
+ fn into_inner( mut self ) -> Self :: Inner {
46
61
match self . inner {
62
+ [ < $name Inner >] :: Uninit ( ..) => {
63
+ self . inner. poll( ) ;
64
+ self . into_inner( )
65
+ } ,
47
66
[ < $name Inner >] :: Poll ( op) => op. into_inner( ) ,
48
67
[ < $name Inner >] :: IoUring ( op) => op. into_inner( ) ,
49
68
}
@@ -53,15 +72,7 @@ macro_rules! op {
53
72
impl <$( $ty: $trait) ,* > $name <$( $ty) ,* > {
54
73
#[ doc = concat!( "Create a new `" , stringify!( $name) , "`." ) ]
55
74
pub fn new( $( $arg: $arg_t) ,* ) -> Self {
56
- match DriverType :: current( ) {
57
- DriverType :: Poll => Self {
58
- inner: [ < $name Inner >] :: Poll ( poll:: $name:: new( $( $arg) ,* ) ) ,
59
- } ,
60
- DriverType :: IoUring => Self {
61
- inner: [ < $name Inner >] :: IoUring ( iour:: $name:: new( $( $arg) ,* ) ) ,
62
- } ,
63
- _ => unreachable!( "Fuse driver will only be enabled on linux" ) ,
64
- }
75
+ Self { inner: [ < $name Inner >] :: Uninit ( $( $arg) ,* ) }
65
76
}
66
77
}
67
78
}
@@ -103,7 +114,7 @@ op!(<S: AsFd> FileStat(fd: S));
103
114
op ! ( <> PathStat ( path: CString , follow_symlink: bool ) ) ;
104
115
105
116
macro_rules! mop {
106
- ( <$( $ty: ident: $trait: ident) ,* $( , ) ?> $name: ident( $( $arg: ident: $arg_t: ty) ,* $( , ) ? ) ) => {
117
+ ( <$( $ty: ident: $trait: ident) ,* $( , ) ?> $name: ident( $( $arg: ident: $arg_t: ty) ,* $( , ) ? ) with $pool : ident ) => {
107
118
:: paste:: paste!{
108
119
enum [ < $name Inner >] <$( $ty: $trait) ,* > {
109
120
Poll ( crate :: op:: managed:: $name<$( $ty) ,* >) ,
@@ -112,17 +123,13 @@ macro_rules! mop {
112
123
113
124
impl <$( $ty: $trait) ,* > [ < $name Inner >] <$( $ty) ,* > {
114
125
fn poll( & mut self ) -> & mut crate :: op:: managed:: $name<$( $ty) ,* > {
115
- debug_assert!( DriverType :: current( ) == DriverType :: Poll ) ;
116
-
117
126
match self {
118
127
Self :: Poll ( ref mut op) => op,
119
128
Self :: IoUring ( _) => unreachable!( "Current driver is not `io-uring`" ) ,
120
129
}
121
130
}
122
131
123
132
fn iour( & mut self ) -> & mut iour:: $name<$( $ty) ,* > {
124
- debug_assert!( DriverType :: current( ) == DriverType :: IoUring ) ;
125
-
126
133
match self {
127
134
Self :: IoUring ( ref mut op) => op,
128
135
Self :: Poll ( _) => unreachable!( "Current driver is not `polling`" ) ,
@@ -138,14 +145,14 @@ macro_rules! mop {
138
145
impl <$( $ty: $trait) ,* > $name <$( $ty) ,* > {
139
146
#[ doc = concat!( "Create a new `" , stringify!( $name) , "`." ) ]
140
147
pub fn new( $( $arg: $arg_t) ,* ) -> std:: io:: Result <Self > {
141
- Ok ( match DriverType :: current( ) {
142
- DriverType :: Poll => Self {
143
- inner: [ < $name Inner >] :: Poll ( crate :: op:: managed:: $name:: new( $( $arg) ,* ) ?) ,
144
- } ,
145
- DriverType :: IoUring => Self {
148
+ Ok ( if $pool. is_io_uring( ) {
149
+ Self {
146
150
inner: [ < $name Inner >] :: IoUring ( iour:: $name:: new( $( $arg) ,* ) ?) ,
147
- } ,
148
- _ => unreachable!( "Fuse driver will only be enabled on linux" ) ,
151
+ }
152
+ } else {
153
+ Self {
154
+ inner: [ < $name Inner >] :: Poll ( crate :: op:: managed:: $name:: new( $( $arg) ,* ) ?) ,
155
+ }
149
156
} )
150
157
}
151
158
}
@@ -196,5 +203,5 @@ macro_rules! mop {
196
203
} ;
197
204
}
198
205
199
- mop ! ( <S : AsFd > ReadManagedAt ( fd: S , offset: u64 , pool: & BufferPool , len: usize ) ) ;
200
- mop ! ( <S : AsFd > RecvManaged ( fd: S , pool: & BufferPool , len: usize ) ) ;
206
+ mop ! ( <S : AsFd > ReadManagedAt ( fd: S , offset: u64 , pool: & BufferPool , len: usize ) with pool ) ;
207
+ mop ! ( <S : AsFd > RecvManaged ( fd: S , pool: & BufferPool , len: usize ) with pool ) ;
0 commit comments