@@ -9,7 +9,7 @@ use crate::{
99 op:: * ,
1010} ;
1111
12- /// Helper macro to execute a system call that returns an `io::Result`.
12+ /// Helper macro to execute a system call
1313macro_rules! syscall {
1414 ( $fn: ident ( $( $arg: expr) ,* $( , ) * ) ) => { {
1515 #[ allow( unused_unsafe) ]
@@ -20,43 +20,26 @@ macro_rules! syscall {
2020 Ok ( res as usize )
2121 }
2222 } } ;
23- }
24-
25- /// Helper macro to execute a system call that returns an `io::Result`.
26- macro_rules! syscall_break {
27- ( $fn: ident ( $( $arg: expr) ,* $( , ) * ) ) => { {
28- #[ allow( unused_unsafe) ]
29- let res = unsafe { :: libc:: $fn( $( $arg, ) * ) } ;
30- if res == -1 {
31- Err ( :: std:: io:: Error :: last_os_error( ) )
32- } else {
33- Ok ( ControlFlow :: Break ( res as _) )
34- }
35- } } ;
36- }
37-
38- /// Execute a system call, if would block, wait for it to be readable.
39- macro_rules! syscall_or_wait_writable {
40- ( $fn: ident ( $( $arg: expr) ,* $( , ) * ) , $fd: expr) => { {
23+ ( break $fn: ident ( $( $arg: expr) ,* $( , ) * ) ) => {
24+ syscall!( $fn ( $( $arg, ) * ) ) . map( ControlFlow :: Break )
25+ } ;
26+ ( $fn: ident ( $( $arg: expr) ,* $( , ) * ) or wait_writable( $fd: expr) ) => {
4127 match syscall!( $fn ( $( $arg, ) * ) ) {
4228 Ok ( fd) => Ok ( Decision :: Completed ( fd) ) ,
43- Err ( e) if e. kind( ) == io:: ErrorKind :: WouldBlock || e. raw_os_error( ) . map_or ( false , |code| code == libc:: EINPROGRESS )
29+ Err ( e) if e. kind( ) == io:: ErrorKind :: WouldBlock || e. raw_os_error( ) == Some ( libc:: EINPROGRESS )
4430 => Ok ( Decision :: wait_writable( $fd) ) ,
4531 Err ( e) => Err ( e) ,
4632 }
47- } } ;
48- }
49-
50- /// Execute a system call, if would block, wait for it to be writable.
51- macro_rules! syscall_or_wait_readable {
52- ( $fn: ident ( $( $arg: expr) ,* $( , ) * ) , $fd: expr) => { {
33+ } ;
34+ ( $fn: ident ( $( $arg: expr) ,* $( , ) * ) or wait_readable( $fd: expr) ) => {
5335 match syscall!( $fn ( $( $arg, ) * ) ) {
5436 Ok ( fd) => Ok ( Decision :: Completed ( fd) ) ,
55- Err ( e) if e. kind( ) == io:: ErrorKind :: WouldBlock || e. raw_os_error( ) . map_or ( false , |code| code == libc:: EINPROGRESS )
37+ Err ( e) if e. kind( ) == io:: ErrorKind :: WouldBlock || e. raw_os_error( ) == Some ( libc:: EINPROGRESS )
5638 => Ok ( Decision :: wait_readable( $fd) ) ,
5739 Err ( e) => Err ( e) ,
5840 }
59- } } ;
41+ }
42+
6043}
6144
6245impl < T : IoBufMut > OpCode for ReadAt < T > {
@@ -69,12 +52,14 @@ impl<T: IoBufMut> OpCode for ReadAt<T> {
6952
7053 let slice = self . buffer . as_uninit_slice ( ) ;
7154
72- syscall_break ! ( pread(
73- self . fd,
74- slice. as_mut_ptr( ) as _,
75- slice. len( ) as _,
76- self . offset as _
77- ) )
55+ syscall ! (
56+ break pread(
57+ self . fd,
58+ slice. as_mut_ptr( ) as _,
59+ slice. len( ) as _,
60+ self . offset as _
61+ )
62+ )
7863 }
7964}
8065
@@ -88,12 +73,14 @@ impl<T: IoBuf> OpCode for WriteAt<T> {
8873
8974 let slice = self . buffer . as_slice ( ) ;
9075
91- syscall_break ! ( pwrite(
92- self . fd,
93- slice. as_ptr( ) as _,
94- slice. len( ) as _,
95- self . offset as _
96- ) )
76+ syscall ! (
77+ break pwrite(
78+ self . fd,
79+ slice. as_ptr( ) as _,
80+ slice. len( ) as _,
81+ self . offset as _
82+ )
83+ )
9784 }
9885}
9986
@@ -109,13 +96,12 @@ impl OpCode for Sync {
10996
11097impl OpCode for Accept {
11198 fn pre_submit ( & mut self ) -> io:: Result < Decision > {
112- syscall_or_wait_readable ! (
99+ syscall ! (
113100 accept(
114101 self . fd,
115102 & mut self . buffer as * mut _ as * mut _,
116103 & mut self . addr_len
117- ) ,
118- self . fd
104+ ) or wait_readable( self . fd)
119105 )
120106 }
121107
@@ -128,23 +114,16 @@ impl OpCode for Accept {
128114 & mut self . addr_len
129115 ) ) {
130116 Ok ( fd) => Ok ( ControlFlow :: Break ( fd) ) ,
131- Err ( e)
132- if e. kind ( ) == io:: ErrorKind :: WouldBlock
133- || e. raw_os_error ( )
134- . map_or ( false , |code| code == libc:: EINPROGRESS ) =>
135- {
136- Ok ( ControlFlow :: Continue ( ( ) ) )
137- }
117+ Err ( e) if e. raw_os_error ( ) == Some ( libc:: EINPROGRESS ) => Ok ( ControlFlow :: Continue ( ( ) ) ) ,
138118 Err ( e) => Err ( e) ,
139119 }
140120 }
141121}
142122
143123impl OpCode for Connect {
144124 fn pre_submit ( & mut self ) -> io:: Result < Decision > {
145- syscall_or_wait_writable ! (
146- connect( self . fd, self . addr. as_ptr( ) , self . addr. len( ) ) ,
147- self . fd
125+ syscall ! (
126+ connect( self . fd, self . addr. as_ptr( ) , self . addr. len( ) ) or wait_writable( self . fd)
148127 )
149128 }
150129
@@ -179,11 +158,7 @@ impl<T: AsIoSlicesMut> OpCode for RecvImpl<T> {
179158 debug_assert ! ( event. is_readable( ) ) ;
180159
181160 self . slices = unsafe { self . buffer . as_io_slices_mut ( ) } ;
182- syscall_break ! ( readv(
183- self . fd,
184- self . slices. as_ptr( ) as _,
185- self . slices. len( ) as _,
186- ) )
161+ syscall ! ( break readv( self . fd, self . slices. as_ptr( ) as _, self . slices. len( ) as _, ) )
187162 }
188163}
189164
@@ -196,36 +171,32 @@ impl<T: AsIoSlices> OpCode for SendImpl<T> {
196171 debug_assert ! ( event. is_writable( ) ) ;
197172
198173 self . slices = unsafe { self . buffer . as_io_slices ( ) } ;
199- syscall_break ! ( writev(
200- self . fd,
201- self . slices. as_ptr( ) as _,
202- self . slices. len( ) as _,
203- ) )
174+ syscall ! ( break writev( self . fd, self . slices. as_ptr( ) as _, self . slices. len( ) as _, ) )
204175 }
205176}
206177
207178impl < T : AsIoSlicesMut > OpCode for RecvFromImpl < T > {
208179 fn pre_submit ( & mut self ) -> io:: Result < Decision > {
209180 self . set_msg ( ) ;
210- syscall_or_wait_readable ! ( recvmsg( self . fd, & mut self . msg, 0 ) , self . fd)
181+ syscall ! ( recvmsg( self . fd, & mut self . msg, 0 ) or wait_readable ( self . fd) )
211182 }
212183
213184 fn on_event ( & mut self , event : & Event ) -> std:: io:: Result < ControlFlow < usize > > {
214185 debug_assert ! ( event. is_readable( ) ) ;
215186
216- syscall_break ! ( recvmsg( self . fd, & mut self . msg, 0 ) )
187+ syscall ! ( break recvmsg( self . fd, & mut self . msg, 0 ) )
217188 }
218189}
219190
220191impl < T : AsIoSlices > OpCode for SendToImpl < T > {
221192 fn pre_submit ( & mut self ) -> io:: Result < Decision > {
222193 self . set_msg ( ) ;
223- syscall_or_wait_writable ! ( sendmsg( self . fd, & self . msg, 0 ) , self . fd)
194+ syscall ! ( sendmsg( self . fd, & self . msg, 0 ) or wait_writable ( self . fd) )
224195 }
225196
226197 fn on_event ( & mut self , event : & Event ) -> std:: io:: Result < ControlFlow < usize > > {
227- assert ! ( event. is_writable( ) ) ;
198+ debug_assert ! ( event. is_writable( ) ) ;
228199
229- syscall_break ! ( sendmsg( self . fd, & self . msg, 0 ) )
200+ syscall ! ( break sendmsg( self . fd, & self . msg, 0 ) )
230201 }
231202}
0 commit comments