Skip to content

Commit

Permalink
Auto merge of rust-lang#122095 - lukas-code:windows-shutdown-test, r=…
Browse files Browse the repository at this point in the history
…ChrisDenton

fix `close_read_wakes_up` test

On windows, `shutdown` does not interrupt `read`, even though we document that it does (see rust-lang#121594).

The `close_read_wakes_up` test has a race condition and only passes on windows if the `shutdown` happens before the `read`. This PR ignores the test on windows adds a sleep to make it more likely that the `read` happens before the `shutdown` and the test actually tests what it is supposed to test on other platforms.

I'm submitting this before any docs changes, so that we can find out on what platforms `shutdown` actually works as documented.

r? `@ChrisDenton`
  • Loading branch information
bors committed Mar 9, 2024
2 parents 1b427b3 + 9abe47e commit 48a15aa
Showing 1 changed file with 18 additions and 15 deletions.
33 changes: 18 additions & 15 deletions library/std/src/net/tcp/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -544,30 +544,33 @@ fn close_readwrite_smoke() {
}

#[test]
// FIXME: https://github.com/fortanix/rust-sgx/issues/110
#[cfg_attr(target_env = "sgx", ignore)]
// On windows, shutdown will not wake up blocking I/O operations.
#[cfg_attr(windows, ignore)]
fn close_read_wakes_up() {
each_ip(&mut |addr| {
let a = t!(TcpListener::bind(&addr));
let (tx1, rx) = channel::<()>();
let listener = t!(TcpListener::bind(&addr));
let _t = thread::spawn(move || {
let _s = t!(a.accept());
let _ = rx.recv();
let (stream, _) = t!(listener.accept());
stream
});

let s = t!(TcpStream::connect(&addr));
let s2 = t!(s.try_clone());
let (tx, rx) = channel();
let mut stream = t!(TcpStream::connect(&addr));
let stream2 = t!(stream.try_clone());

let _t = thread::spawn(move || {
let mut s2 = s2;
assert_eq!(t!(s2.read(&mut [0])), 0);
tx.send(()).unwrap();
let stream2 = stream2;

// to make it more likely that `read` happens before `shutdown`
thread::sleep(Duration::from_millis(1000));

// this should wake up the reader up
t!(stream2.shutdown(Shutdown::Read));
});
// this should wake up the child thread
t!(s.shutdown(Shutdown::Read));

// this test will never finish if the child doesn't wake up
rx.recv().unwrap();
drop(tx1);
// this `read` should get interrupted by `shutdown`
assert_eq!(t!(stream.read(&mut [0])), 0);
})
}

Expand Down

0 comments on commit 48a15aa

Please sign in to comment.