diff --git a/test_dependencies/Cargo.lock b/test_dependencies/Cargo.lock index 8d18d8535d..7b7bb41fc4 100644 --- a/test_dependencies/Cargo.lock +++ b/test_dependencies/Cargo.lock @@ -161,7 +161,7 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -175,6 +175,7 @@ dependencies = [ "page_size", "rand", "tokio", + "windows-sys 0.52.0", ] [[package]] @@ -232,7 +233,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -338,7 +339,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -368,7 +369,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -482,7 +483,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -491,13 +501,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -506,38 +531,80 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" diff --git a/test_dependencies/Cargo.toml b/test_dependencies/Cargo.toml index d54560608d..f7d385f589 100644 --- a/test_dependencies/Cargo.toml +++ b/test_dependencies/Cargo.toml @@ -20,4 +20,7 @@ rand = { version = "0.8", features = ["small_rng"] } page_size = "0.6" tokio = { version = "1.24", features = ["full"] } +[target.'cfg(windows)'.dependencies] +windows-sys = { version = "0.52", features = [ "Win32_Foundation", "Win32_System_Threading" ] } + [workspace] diff --git a/tests/fail/concurrency/windows_join_detached.rs b/tests/fail-dep/concurrency/windows_join_detached.rs similarity index 62% rename from tests/fail/concurrency/windows_join_detached.rs rename to tests/fail-dep/concurrency/windows_join_detached.rs index b68a07797f..0e9eb24459 100644 --- a/tests/fail/concurrency/windows_join_detached.rs +++ b/tests/fail-dep/concurrency/windows_join_detached.rs @@ -3,18 +3,16 @@ // Joining a detached thread is undefined behavior. -use std::os::windows::io::{AsRawHandle, RawHandle}; +use std::os::windows::io::AsRawHandle; use std::thread; -extern "system" { - fn CloseHandle(handle: RawHandle) -> u32; -} +use windows_sys::Win32::Foundation::{CloseHandle, HANDLE}; fn main() { let thread = thread::spawn(|| ()); unsafe { - assert_ne!(CloseHandle(thread.as_raw_handle()), 0); + assert_ne!(CloseHandle(thread.as_raw_handle() as HANDLE), 0); } thread.join().unwrap(); diff --git a/tests/fail/concurrency/windows_join_detached.stderr b/tests/fail-dep/concurrency/windows_join_detached.stderr similarity index 100% rename from tests/fail/concurrency/windows_join_detached.stderr rename to tests/fail-dep/concurrency/windows_join_detached.stderr diff --git a/tests/fail/concurrency/windows_join_main.rs b/tests/fail-dep/concurrency/windows_join_main.rs similarity index 70% rename from tests/fail/concurrency/windows_join_main.rs rename to tests/fail-dep/concurrency/windows_join_main.rs index cde6d19ef2..910e06222e 100644 --- a/tests/fail/concurrency/windows_join_main.rs +++ b/tests/fail-dep/concurrency/windows_join_main.rs @@ -6,21 +6,18 @@ use std::thread; -extern "system" { - fn WaitForSingleObject(handle: isize, timeout: u32) -> u32; -} - -const INFINITE: u32 = u32::MAX; +use windows_sys::Win32::Foundation::{HANDLE, WAIT_OBJECT_0}; +use windows_sys::Win32::System::Threading::{WaitForSingleObject, INFINITE}; // XXX HACK: This is how miri represents the handle for thread 0. // This value can be "legitimately" obtained by using `GetCurrentThread` with `DuplicateHandle` // but miri does not implement `DuplicateHandle` yet. -const MAIN_THREAD: isize = (2i32 << 30) as isize; +const MAIN_THREAD: HANDLE = (2i32 << 30) as HANDLE; fn main() { thread::spawn(|| { unsafe { - assert_eq!(WaitForSingleObject(MAIN_THREAD, INFINITE), 0); //~ ERROR: deadlock: the evaluated program deadlocked + assert_eq!(WaitForSingleObject(MAIN_THREAD, INFINITE), WAIT_OBJECT_0); //~ ERROR: deadlock: the evaluated program deadlocked } }) .join() diff --git a/tests/fail/concurrency/windows_join_main.stderr b/tests/fail-dep/concurrency/windows_join_main.stderr similarity index 87% rename from tests/fail/concurrency/windows_join_main.stderr rename to tests/fail-dep/concurrency/windows_join_main.stderr index 94fe95a0bd..cb51c7e0bd 100644 --- a/tests/fail/concurrency/windows_join_main.stderr +++ b/tests/fail-dep/concurrency/windows_join_main.stderr @@ -1,8 +1,8 @@ error: deadlock: the evaluated program deadlocked --> $DIR/windows_join_main.rs:LL:CC | -LL | assert_eq!(WaitForSingleObject(MAIN_THREAD, INFINITE), 0); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program deadlocked +LL | assert_eq!(WaitForSingleObject(MAIN_THREAD, INFINITE), WAIT_OBJECT_0); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program deadlocked | = note: inside closure at RUSTLIB/core/src/macros/mod.rs:LL:CC = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/fail/concurrency/windows_join_self.rs b/tests/fail-dep/concurrency/windows_join_self.rs similarity index 57% rename from tests/fail/concurrency/windows_join_self.rs rename to tests/fail-dep/concurrency/windows_join_self.rs index d9bbf66a7d..a7c8faf5a9 100644 --- a/tests/fail/concurrency/windows_join_self.rs +++ b/tests/fail-dep/concurrency/windows_join_self.rs @@ -6,18 +6,14 @@ use std::thread; -extern "system" { - fn GetCurrentThread() -> usize; - fn WaitForSingleObject(handle: usize, timeout: u32) -> u32; -} - -const INFINITE: u32 = u32::MAX; +use windows_sys::Win32::Foundation::WAIT_OBJECT_0; +use windows_sys::Win32::System::Threading::{GetCurrentThread, WaitForSingleObject, INFINITE}; fn main() { thread::spawn(|| { unsafe { let native = GetCurrentThread(); - assert_eq!(WaitForSingleObject(native, INFINITE), 0); //~ ERROR: deadlock: the evaluated program deadlocked + assert_eq!(WaitForSingleObject(native, INFINITE), WAIT_OBJECT_0); //~ ERROR: deadlock: the evaluated program deadlocked } }) .join() diff --git a/tests/fail/concurrency/windows_join_self.stderr b/tests/fail-dep/concurrency/windows_join_self.stderr similarity index 96% rename from tests/fail/concurrency/windows_join_self.stderr rename to tests/fail-dep/concurrency/windows_join_self.stderr index 0d2a22677c..8b76e12421 100644 --- a/tests/fail/concurrency/windows_join_self.stderr +++ b/tests/fail-dep/concurrency/windows_join_self.stderr @@ -1,7 +1,7 @@ error: deadlock: the evaluated program deadlocked --> $DIR/windows_join_self.rs:LL:CC | -LL | assert_eq!(WaitForSingleObject(native, INFINITE), 0); +LL | assert_eq!(WaitForSingleObject(native, INFINITE), WAIT_OBJECT_0); | ^ the evaluated program deadlocked | = note: inside closure at $DIR/windows_join_self.rs:LL:CC diff --git a/tests/pass/concurrency/windows_condvar_shared.rs b/tests/pass-dep/concurrency/windows_condvar_shared.rs similarity index 88% rename from tests/pass/concurrency/windows_condvar_shared.rs rename to tests/pass-dep/concurrency/windows_condvar_shared.rs index 3b27af9094..5bff9098a5 100644 --- a/tests/pass/concurrency/windows_condvar_shared.rs +++ b/tests/pass-dep/concurrency/windows_condvar_shared.rs @@ -2,39 +2,30 @@ // We are making scheduler assumptions here. //@compile-flags: -Zmiri-preemption-rate=0 -use std::ffi::c_void; use std::ptr::null_mut; use std::thread; +use windows_sys::Win32::System::Threading::{ + AcquireSRWLockExclusive, AcquireSRWLockShared, ReleaseSRWLockExclusive, ReleaseSRWLockShared, + SleepConditionVariableSRW, WakeAllConditionVariable, CONDITION_VARIABLE, + CONDITION_VARIABLE_LOCKMODE_SHARED, INFINITE, SRWLOCK, +}; + +// not in windows-sys +const SRWLOCK_INIT: SRWLOCK = SRWLOCK { Ptr: null_mut() }; +const CONDITION_VARIABLE_INIT: CONDITION_VARIABLE = CONDITION_VARIABLE { Ptr: null_mut() }; + #[derive(Copy, Clone)] struct SendPtr(*mut T); unsafe impl Send for SendPtr {} -extern "system" { - fn SleepConditionVariableSRW( - condvar: *mut *mut c_void, - lock: *mut *mut c_void, - timeout: u32, - flags: u32, - ) -> i32; - fn WakeAllConditionVariable(condvar: *mut *mut c_void); - - fn AcquireSRWLockExclusive(lock: *mut *mut c_void); - fn AcquireSRWLockShared(lock: *mut *mut c_void); - fn ReleaseSRWLockExclusive(lock: *mut *mut c_void); - fn ReleaseSRWLockShared(lock: *mut *mut c_void); -} - -const CONDITION_VARIABLE_LOCKMODE_SHARED: u32 = 1; -const INFINITE: u32 = u32::MAX; - /// threads should be able to reacquire the lock while it is locked by multiple other threads in shared mode fn all_shared() { println!("all_shared"); - let mut lock = null_mut(); - let mut condvar = null_mut(); + let mut lock = SRWLOCK_INIT; + let mut condvar = CONDITION_VARIABLE_INIT; let lock_ptr = SendPtr(&mut lock); let condvar_ptr = SendPtr(&mut condvar); @@ -105,8 +96,8 @@ fn all_shared() { fn shared_sleep_and_exclusive_lock() { println!("shared_sleep_and_exclusive_lock"); - let mut lock = null_mut(); - let mut condvar = null_mut(); + let mut lock = SRWLOCK_INIT; + let mut condvar = CONDITION_VARIABLE_INIT; let lock_ptr = SendPtr(&mut lock); let condvar_ptr = SendPtr(&mut condvar); @@ -166,8 +157,8 @@ fn shared_sleep_and_exclusive_lock() { fn exclusive_sleep_and_shared_lock() { println!("exclusive_sleep_and_shared_lock"); - let mut lock = null_mut(); - let mut condvar = null_mut(); + let mut lock = SRWLOCK_INIT; + let mut condvar = CONDITION_VARIABLE_INIT; let lock_ptr = SendPtr(&mut lock); let condvar_ptr = SendPtr(&mut condvar); diff --git a/tests/pass/concurrency/windows_condvar_shared.stdout b/tests/pass-dep/concurrency/windows_condvar_shared.stdout similarity index 100% rename from tests/pass/concurrency/windows_condvar_shared.stdout rename to tests/pass-dep/concurrency/windows_condvar_shared.stdout diff --git a/tests/pass/concurrency/windows_detach_terminated.rs b/tests/pass-dep/concurrency/windows_detach_terminated.rs similarity index 74% rename from tests/pass/concurrency/windows_detach_terminated.rs rename to tests/pass-dep/concurrency/windows_detach_terminated.rs index 91088ce6ae..3d4f8c5e1c 100644 --- a/tests/pass/concurrency/windows_detach_terminated.rs +++ b/tests/pass-dep/concurrency/windows_detach_terminated.rs @@ -5,12 +5,10 @@ use std::os::windows::io::IntoRawHandle; use std::thread; -extern "system" { - fn CloseHandle(handle: usize) -> i32; -} +use windows_sys::Win32::Foundation::{CloseHandle, HANDLE}; fn main() { - let thread = thread::spawn(|| {}).into_raw_handle() as usize; + let thread = thread::spawn(|| {}).into_raw_handle() as HANDLE; // this yield ensures that `thread` is terminated by this point thread::yield_now(); diff --git a/tests/pass/concurrency/windows_init_once.rs b/tests/pass-dep/concurrency/windows_init_once.rs similarity index 88% rename from tests/pass/concurrency/windows_init_once.rs rename to tests/pass-dep/concurrency/windows_init_once.rs index b2412f7dbb..5e33617f98 100644 --- a/tests/pass/concurrency/windows_init_once.rs +++ b/tests/pass-dep/concurrency/windows_init_once.rs @@ -2,33 +2,24 @@ // We are making scheduler assumptions here. //@compile-flags: -Zmiri-preemption-rate=0 -use std::ffi::c_void; use std::ptr::null_mut; use std::thread; +use windows_sys::Win32::Foundation::{FALSE, TRUE}; +use windows_sys::Win32::System::Threading::{ + InitOnceBeginInitialize, InitOnceComplete, INIT_ONCE, INIT_ONCE_INIT_FAILED, +}; + +// not in windows-sys +const INIT_ONCE_STATIC_INIT: INIT_ONCE = INIT_ONCE { Ptr: null_mut() }; + #[derive(Copy, Clone)] struct SendPtr(*mut T); unsafe impl Send for SendPtr {} -extern "system" { - fn InitOnceBeginInitialize( - init: *mut *mut c_void, - flags: u32, - pending: *mut i32, - context: *mut c_void, - ) -> i32; - - fn InitOnceComplete(init: *mut *mut c_void, flags: u32, context: *mut c_void) -> i32; -} - -const TRUE: i32 = 1; -const FALSE: i32 = 0; - -const INIT_ONCE_INIT_FAILED: u32 = 4; - fn single_thread() { - let mut init_once = null_mut(); + let mut init_once = INIT_ONCE_STATIC_INIT; let mut pending = 0; unsafe { @@ -41,7 +32,7 @@ fn single_thread() { assert_eq!(pending, FALSE); } - let mut init_once = null_mut(); + let mut init_once = INIT_ONCE_STATIC_INIT; unsafe { assert_eq!(InitOnceBeginInitialize(&mut init_once, 0, &mut pending, null_mut()), TRUE); @@ -55,7 +46,7 @@ fn single_thread() { } fn block_until_complete() { - let mut init_once = null_mut(); + let mut init_once = INIT_ONCE_STATIC_INIT; let mut pending = 0; unsafe { @@ -92,7 +83,7 @@ fn block_until_complete() { } fn retry_on_fail() { - let mut init_once = null_mut(); + let mut init_once = INIT_ONCE_STATIC_INIT; let mut pending = 0; unsafe { @@ -134,7 +125,7 @@ fn retry_on_fail() { } fn no_data_race_after_complete() { - let mut init_once = null_mut(); + let mut init_once = INIT_ONCE_STATIC_INIT; let mut pending = 0; unsafe { diff --git a/tests/pass/concurrency/windows_init_once.stdout b/tests/pass-dep/concurrency/windows_init_once.stdout similarity index 100% rename from tests/pass/concurrency/windows_init_once.stdout rename to tests/pass-dep/concurrency/windows_init_once.stdout diff --git a/tests/pass/concurrency/windows_join_multiple.rs b/tests/pass-dep/concurrency/windows_join_multiple.rs similarity index 76% rename from tests/pass/concurrency/windows_join_multiple.rs rename to tests/pass-dep/concurrency/windows_join_multiple.rs index 5da5497f98..bff59591a9 100644 --- a/tests/pass/concurrency/windows_join_multiple.rs +++ b/tests/pass-dep/concurrency/windows_join_multiple.rs @@ -6,11 +6,8 @@ use std::os::windows::io::IntoRawHandle; use std::sync::atomic::{AtomicBool, Ordering}; use std::thread; -extern "system" { - fn WaitForSingleObject(handle: usize, timeout: u32) -> u32; -} - -const INFINITE: u32 = u32::MAX; +use windows_sys::Win32::Foundation::{HANDLE, WAIT_OBJECT_0}; +use windows_sys::Win32::System::Threading::{WaitForSingleObject, INFINITE}; fn main() { static FLAG: AtomicBool = AtomicBool::new(false); @@ -20,10 +17,10 @@ fn main() { thread::yield_now(); } }) - .into_raw_handle() as usize; + .into_raw_handle() as HANDLE; let waiter = move || unsafe { - assert_eq!(WaitForSingleObject(blocker, INFINITE), 0); + assert_eq!(WaitForSingleObject(blocker, INFINITE), WAIT_OBJECT_0); }; let waiter1 = thread::spawn(waiter);