about summary refs log tree commit diff
path: root/library/std/src/net/tcp
diff options
context:
space:
mode:
authorLukas Markeffsky <@>2024-03-06 18:01:09 +0100
committerLukas Markeffsky <@>2024-03-06 18:01:09 +0100
commit9abe47e3720d8fc236464a9295389fc0b21f67e5 (patch)
treefb2bc420a215526af667b297cb5b9fce5d24ae12 /library/std/src/net/tcp
parent3314d5ce4c209e840c2e4b2c4442f6e031ae0989 (diff)
downloadrust-9abe47e3720d8fc236464a9295389fc0b21f67e5.tar.gz
rust-9abe47e3720d8fc236464a9295389fc0b21f67e5.zip
fix `close_read_wakes_up` test
Diffstat (limited to 'library/std/src/net/tcp')
-rw-r--r--library/std/src/net/tcp/tests.rs33
1 files changed, 18 insertions, 15 deletions
diff --git a/library/std/src/net/tcp/tests.rs b/library/std/src/net/tcp/tests.rs
index b24b851a645..ec8b62f9687 100644
--- a/library/std/src/net/tcp/tests.rs
+++ b/library/std/src/net/tcp/tests.rs
@@ -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);
     })
 }