@@ -168,35 +168,20 @@ impl Socket {
168
168
#[ async_trait]
169
169
impl ObjectInterface for Socket {
170
170
async fn poll ( & self , event : PollEvent ) -> Result < PollEvent , IoError > {
171
- let mut result: PollEvent = PollEvent :: empty ( ) ;
172
-
173
171
future:: poll_fn ( |cx| {
174
172
self . with ( |socket| match socket. state ( ) {
175
173
tcp:: State :: Closed | tcp:: State :: Closing | tcp:: State :: CloseWait => {
176
- if event. contains ( PollEvent :: POLLOUT ) {
177
- result. insert ( PollEvent :: POLLOUT ) ;
178
- }
179
- if event. contains ( PollEvent :: POLLWRNORM ) {
180
- result. insert ( PollEvent :: POLLWRNORM ) ;
181
- }
182
- if event. contains ( PollEvent :: POLLWRBAND ) {
183
- result. insert ( PollEvent :: POLLWRBAND ) ;
184
- }
174
+ let available = PollEvent :: POLLOUT
175
+ | PollEvent :: POLLWRNORM | PollEvent :: POLLWRBAND
176
+ | PollEvent :: POLLIN | PollEvent :: POLLRDNORM
177
+ | PollEvent :: POLLRDBAND ;
185
178
186
- if event. contains ( PollEvent :: POLLIN ) {
187
- result. insert ( PollEvent :: POLLIN ) ;
188
- }
189
- if event. contains ( PollEvent :: POLLRDNORM ) {
190
- result. insert ( PollEvent :: POLLRDNORM ) ;
191
- }
192
- if event. contains ( PollEvent :: POLLRDBAND ) {
193
- result. insert ( PollEvent :: POLLRDBAND ) ;
194
- }
179
+ let ret = event & available;
195
180
196
- if result . is_empty ( ) {
181
+ if ret . is_empty ( ) {
197
182
Poll :: Ready ( Ok ( PollEvent :: POLLHUP ) )
198
183
} else {
199
- Poll :: Ready ( Ok ( result ) )
184
+ Poll :: Ready ( Ok ( ret ) )
200
185
}
201
186
}
202
187
tcp:: State :: FinWait1 | tcp:: State :: FinWait2 | tcp:: State :: TimeWait => {
@@ -208,49 +193,31 @@ impl ObjectInterface for Socket {
208
193
Poll :: Pending
209
194
}
210
195
_ => {
211
- if socket. may_recv ( ) && self . listen . swap ( false , Ordering :: Relaxed ) {
196
+ let mut available = PollEvent :: empty ( ) ;
197
+
198
+ if socket. can_recv ( )
199
+ || socket. may_recv ( ) && self . listen . swap ( false , Ordering :: Relaxed )
200
+ {
212
201
// In case, we just establish a fresh connection in non-blocking mode, we try to read data.
213
- if event. contains ( PollEvent :: POLLIN ) {
214
- result. insert ( PollEvent :: POLLIN ) ;
215
- }
216
- if event. contains ( PollEvent :: POLLRDNORM ) {
217
- result. insert ( PollEvent :: POLLRDNORM ) ;
218
- }
219
- if event. contains ( PollEvent :: POLLRDBAND ) {
220
- result. insert ( PollEvent :: POLLRDBAND ) ;
221
- }
202
+ available. insert (
203
+ PollEvent :: POLLIN | PollEvent :: POLLRDNORM | PollEvent :: POLLRDBAND ,
204
+ ) ;
222
205
}
223
206
224
207
if socket. can_send ( ) {
225
- if event. contains ( PollEvent :: POLLOUT ) {
226
- result. insert ( PollEvent :: POLLOUT ) ;
227
- }
228
- if event. contains ( PollEvent :: POLLWRNORM ) {
229
- result. insert ( PollEvent :: POLLWRNORM ) ;
230
- }
231
- if event. contains ( PollEvent :: POLLWRBAND ) {
232
- result. insert ( PollEvent :: POLLWRBAND ) ;
233
- }
208
+ available. insert (
209
+ PollEvent :: POLLOUT | PollEvent :: POLLWRNORM | PollEvent :: POLLWRBAND ,
210
+ ) ;
234
211
}
235
212
236
- if socket. can_recv ( ) {
237
- if event. contains ( PollEvent :: POLLIN ) {
238
- result. insert ( PollEvent :: POLLIN ) ;
239
- }
240
- if event. contains ( PollEvent :: POLLRDNORM ) {
241
- result. insert ( PollEvent :: POLLRDNORM ) ;
242
- }
243
- if event. contains ( PollEvent :: POLLRDBAND ) {
244
- result. insert ( PollEvent :: POLLRDBAND ) ;
245
- }
246
- }
213
+ let ret = event & available;
247
214
248
- if result . is_empty ( ) {
215
+ if ret . is_empty ( ) {
249
216
socket. register_recv_waker ( cx. waker ( ) ) ;
250
217
socket. register_send_waker ( cx. waker ( ) ) ;
251
218
Poll :: Pending
252
219
} else {
253
- Poll :: Ready ( Ok ( result ) )
220
+ Poll :: Ready ( Ok ( ret ) )
254
221
}
255
222
}
256
223
} )
0 commit comments