about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2025-04-04 15:28:14 +0200
committerRalf Jung <post@ralfj.de>2025-04-04 15:28:14 +0200
commite2c8ae96f6814ac80cdf3952a881da51867b73c8 (patch)
tree099d74781dd8340af48d79d584c6651fc91c286d
parenteb00d966a0bb3124e4ac75993177d999e4c1116d (diff)
downloadrust-e2c8ae96f6814ac80cdf3952a881da51867b73c8.tar.gz
rust-e2c8ae96f6814ac80cdf3952a881da51867b73c8.zip
fix windows_join_multiple
-rw-r--r--src/tools/miri/tests/pass-dep/concurrency/windows_join_multiple.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/tools/miri/tests/pass-dep/concurrency/windows_join_multiple.rs b/src/tools/miri/tests/pass-dep/concurrency/windows_join_multiple.rs
index ce829eee227..2796541a3d7 100644
--- a/src/tools/miri/tests/pass-dep/concurrency/windows_join_multiple.rs
+++ b/src/tools/miri/tests/pass-dep/concurrency/windows_join_multiple.rs
@@ -9,6 +9,10 @@ use std::thread;
 use windows_sys::Win32::Foundation::{HANDLE, WAIT_OBJECT_0};
 use windows_sys::Win32::System::Threading::{INFINITE, WaitForSingleObject};
 
+#[derive(Copy, Clone)]
+struct UnsafeSendWrapper<T>(T);
+unsafe impl<T> Send for UnsafeSendWrapper<T> {}
+
 fn main() {
     static FLAG: AtomicBool = AtomicBool::new(false);
 
@@ -17,10 +21,12 @@ fn main() {
             thread::yield_now();
         }
     })
-    .into_raw_handle() as HANDLE;
+    .into_raw_handle();
+    let blocker = UnsafeSendWrapper(blocker as HANDLE);
 
     let waiter = move || unsafe {
-        assert_eq!(WaitForSingleObject(blocker, INFINITE), WAIT_OBJECT_0);
+        let blocker = blocker; // circumvent per-field capturing
+        assert_eq!(WaitForSingleObject(blocker.0, INFINITE), WAIT_OBJECT_0);
     };
 
     let waiter1 = thread::spawn(waiter);