@@ -302,7 +302,7 @@ async fn reregister() {
302
302
303
303
#[ tokio:: test]
304
304
#[ cfg_attr( miri, ignore) ] // No F_GETFL for fcntl in miri.
305
- async fn try_io ( ) {
305
+ async fn guard_try_io ( ) {
306
306
let ( a, mut b) = socketpair ( ) ;
307
307
308
308
b. write_all ( b"0" ) . unwrap ( ) ;
@@ -336,6 +336,108 @@ async fn try_io() {
336
336
let _ = readable. await . unwrap ( ) ;
337
337
}
338
338
339
+ #[ tokio:: test]
340
+ #[ cfg_attr( miri, ignore) ] // No F_GETFL for fcntl in miri.
341
+ async fn try_io_readable ( ) {
342
+ let ( a, mut b) = socketpair ( ) ;
343
+ let mut afd_a = AsyncFd :: new ( a) . unwrap ( ) ;
344
+
345
+ // Give the runtime some time to update bookkeeping.
346
+ tokio:: task:: yield_now ( ) . await ;
347
+
348
+ {
349
+ let mut called = false ;
350
+ let _ = afd_a. try_io_mut ( Interest :: READABLE , |_| {
351
+ called = true ;
352
+ Ok ( ( ) )
353
+ } ) ;
354
+ assert ! (
355
+ !called,
356
+ "closure should not have been called, since socket should not be readable"
357
+ ) ;
358
+ }
359
+
360
+ // Make `a` readable by writing to `b`.
361
+ // Give the runtime some time to update bookkeeping.
362
+ b. write_all ( & [ 0 ] ) . unwrap ( ) ;
363
+ tokio:: task:: yield_now ( ) . await ;
364
+
365
+ {
366
+ let mut called = false ;
367
+ let _ = afd_a. try_io ( Interest :: READABLE , |_| {
368
+ called = true ;
369
+ Ok ( ( ) )
370
+ } ) ;
371
+ assert ! (
372
+ called,
373
+ "closure should have been called, since socket should have data available to read"
374
+ ) ;
375
+ }
376
+
377
+ {
378
+ let mut called = false ;
379
+ let _ = afd_a. try_io ( Interest :: READABLE , |_| {
380
+ called = true ;
381
+ io:: Result :: < ( ) > :: Err ( ErrorKind :: WouldBlock . into ( ) )
382
+ } ) ;
383
+ assert ! (
384
+ called,
385
+ "closure should have been called, since socket should have data available to read"
386
+ ) ;
387
+ }
388
+
389
+ {
390
+ let mut called = false ;
391
+ let _ = afd_a. try_io ( Interest :: READABLE , |_| {
392
+ called = true ;
393
+ Ok ( ( ) )
394
+ } ) ;
395
+ assert ! ( !called, "closure should not have been called, since socket readable state should have been cleared" ) ;
396
+ }
397
+ }
398
+
399
+ #[ tokio:: test]
400
+ #[ cfg_attr( miri, ignore) ] // No F_GETFL for fcntl in miri.
401
+ async fn try_io_writable ( ) {
402
+ let ( a, _b) = socketpair ( ) ;
403
+ let afd_a = AsyncFd :: new ( a) . unwrap ( ) ;
404
+
405
+ // Give the runtime some time to update bookkeeping.
406
+ tokio:: task:: yield_now ( ) . await ;
407
+
408
+ {
409
+ let mut called = false ;
410
+ let _ = afd_a. try_io ( Interest :: WRITABLE , |_| {
411
+ called = true ;
412
+ Ok ( ( ) )
413
+ } ) ;
414
+ assert ! (
415
+ called,
416
+ "closure should have been called, since socket should still be marked as writable"
417
+ ) ;
418
+ }
419
+ {
420
+ let mut called = false ;
421
+ let _ = afd_a. try_io ( Interest :: WRITABLE , |_| {
422
+ called = true ;
423
+ io:: Result :: < ( ) > :: Err ( ErrorKind :: WouldBlock . into ( ) )
424
+ } ) ;
425
+ assert ! (
426
+ called,
427
+ "closure should have been called, since socket should still be marked as writable"
428
+ ) ;
429
+ }
430
+
431
+ {
432
+ let mut called = false ;
433
+ let _ = afd_a. try_io ( Interest :: WRITABLE , |_| {
434
+ called = true ;
435
+ Ok ( ( ) )
436
+ } ) ;
437
+ assert ! ( !called, "closure should not have been called, since socket writable state should have been cleared" ) ;
438
+ }
439
+ }
440
+
339
441
#[ tokio:: test]
340
442
#[ cfg_attr( miri, ignore) ] // No F_GETFL for fcntl in miri.
341
443
async fn multiple_waiters ( ) {
0 commit comments