1- use std:: ffi:: CString ;
1+ use std:: { ffi:: CString , hint :: unreachable_unchecked } ;
22
33use compio_buf:: { IntoInner , IoBuf , IoBufMut , IoVectoredBuf , IoVectoredBufMut } ;
44use socket2:: SockAddr ;
@@ -10,24 +10,39 @@ macro_rules! op {
1010 ( <$( $ty: ident: $trait: ident) ,* $( , ) ?> $name: ident( $( $arg: ident: $arg_t: ty) ,* $( , ) ? ) ) => {
1111 :: paste:: paste!{
1212 enum [ < $name Inner >] <$( $ty: $trait) ,* > {
13+ Uninit ( $( $arg_t) ,* ) ,
1314 Poll ( poll:: $name<$( $ty) ,* >) ,
1415 IoUring ( iour:: $name<$( $ty) ,* >) ,
1516 }
1617
1718 impl <$( $ty: $trait) ,* > [ < $name Inner >] <$( $ty) ,* > {
1819 fn poll( & mut self ) -> & mut poll:: $name<$( $ty) ,* > {
19- debug_assert!( DriverType :: current( ) == DriverType :: Poll ) ;
20-
2120 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+ } ,
2230 Self :: Poll ( ref mut op) => op,
2331 Self :: IoUring ( _) => unreachable!( "Current driver is not `io-uring`" ) ,
2432 }
2533 }
2634
2735 fn iour( & mut self ) -> & mut iour:: $name<$( $ty) ,* > {
28- debug_assert!( DriverType :: current( ) == DriverType :: IoUring ) ;
29-
3036 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+ } ,
3146 Self :: IoUring ( ref mut op) => op,
3247 Self :: Poll ( _) => unreachable!( "Current driver is not `polling`" ) ,
3348 }
@@ -42,8 +57,12 @@ macro_rules! op {
4257 impl <$( $ty: $trait) ,* > IntoInner for $name <$( $ty) ,* > {
4358 type Inner = <poll:: $name<$( $ty) ,* > as IntoInner >:: Inner ;
4459
45- fn into_inner( self ) -> Self :: Inner {
60+ fn into_inner( mut self ) -> Self :: Inner {
4661 match self . inner {
62+ [ < $name Inner >] :: Uninit ( ..) => {
63+ self . inner. poll( ) ;
64+ self . into_inner( )
65+ } ,
4766 [ < $name Inner >] :: Poll ( op) => op. into_inner( ) ,
4867 [ < $name Inner >] :: IoUring ( op) => op. into_inner( ) ,
4968 }
@@ -53,15 +72,7 @@ macro_rules! op {
5372 impl <$( $ty: $trait) ,* > $name <$( $ty) ,* > {
5473 #[ doc = concat!( "Create a new `" , stringify!( $name) , "`." ) ]
5574 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) ,* ) }
6576 }
6677 }
6778 }
@@ -103,7 +114,7 @@ op!(<S: AsFd> FileStat(fd: S));
103114op ! ( <> PathStat ( path: CString , follow_symlink: bool ) ) ;
104115
105116macro_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 ) => {
107118 :: paste:: paste!{
108119 enum [ < $name Inner >] <$( $ty: $trait) ,* > {
109120 Poll ( crate :: op:: managed:: $name<$( $ty) ,* >) ,
@@ -112,17 +123,13 @@ macro_rules! mop {
112123
113124 impl <$( $ty: $trait) ,* > [ < $name Inner >] <$( $ty) ,* > {
114125 fn poll( & mut self ) -> & mut crate :: op:: managed:: $name<$( $ty) ,* > {
115- debug_assert!( DriverType :: current( ) == DriverType :: Poll ) ;
116-
117126 match self {
118127 Self :: Poll ( ref mut op) => op,
119128 Self :: IoUring ( _) => unreachable!( "Current driver is not `io-uring`" ) ,
120129 }
121130 }
122131
123132 fn iour( & mut self ) -> & mut iour:: $name<$( $ty) ,* > {
124- debug_assert!( DriverType :: current( ) == DriverType :: IoUring ) ;
125-
126133 match self {
127134 Self :: IoUring ( ref mut op) => op,
128135 Self :: Poll ( _) => unreachable!( "Current driver is not `polling`" ) ,
@@ -138,14 +145,14 @@ macro_rules! mop {
138145 impl <$( $ty: $trait) ,* > $name <$( $ty) ,* > {
139146 #[ doc = concat!( "Create a new `" , stringify!( $name) , "`." ) ]
140147 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 {
146150 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+ }
149156 } )
150157 }
151158 }
@@ -196,5 +203,5 @@ macro_rules! mop {
196203 } ;
197204}
198205
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