|
2 | 2 | // We are making scheduler assumptions here.
|
3 | 3 | //@compile-flags: -Zmiri-preemption-rate=0
|
4 | 4 |
|
5 |
| -use std::ffi::c_void; |
6 | 5 | use std::ptr::null_mut;
|
7 | 6 | use std::thread;
|
8 | 7 |
|
| 8 | +use windows_sys::Win32::System::Threading::{ |
| 9 | + AcquireSRWLockExclusive, AcquireSRWLockShared, ReleaseSRWLockExclusive, ReleaseSRWLockShared, |
| 10 | + SleepConditionVariableSRW, WakeAllConditionVariable, CONDITION_VARIABLE, |
| 11 | + CONDITION_VARIABLE_LOCKMODE_SHARED, INFINITE, SRWLOCK, |
| 12 | +}; |
| 13 | + |
| 14 | +// not in windows-sys |
| 15 | +const SRWLOCK_INIT: SRWLOCK = SRWLOCK { Ptr: null_mut() }; |
| 16 | +const CONDITION_VARIABLE_INIT: CONDITION_VARIABLE = CONDITION_VARIABLE { Ptr: null_mut() }; |
| 17 | + |
9 | 18 | #[derive(Copy, Clone)]
|
10 | 19 | struct SendPtr<T>(*mut T);
|
11 | 20 |
|
12 | 21 | unsafe impl<T> Send for SendPtr<T> {}
|
13 | 22 |
|
14 |
| -extern "system" { |
15 |
| - fn SleepConditionVariableSRW( |
16 |
| - condvar: *mut *mut c_void, |
17 |
| - lock: *mut *mut c_void, |
18 |
| - timeout: u32, |
19 |
| - flags: u32, |
20 |
| - ) -> i32; |
21 |
| - fn WakeAllConditionVariable(condvar: *mut *mut c_void); |
22 |
| - |
23 |
| - fn AcquireSRWLockExclusive(lock: *mut *mut c_void); |
24 |
| - fn AcquireSRWLockShared(lock: *mut *mut c_void); |
25 |
| - fn ReleaseSRWLockExclusive(lock: *mut *mut c_void); |
26 |
| - fn ReleaseSRWLockShared(lock: *mut *mut c_void); |
27 |
| -} |
28 |
| - |
29 |
| -const CONDITION_VARIABLE_LOCKMODE_SHARED: u32 = 1; |
30 |
| -const INFINITE: u32 = u32::MAX; |
31 |
| - |
32 | 23 | /// threads should be able to reacquire the lock while it is locked by multiple other threads in shared mode
|
33 | 24 | fn all_shared() {
|
34 | 25 | println!("all_shared");
|
35 | 26 |
|
36 |
| - let mut lock = null_mut(); |
37 |
| - let mut condvar = null_mut(); |
| 27 | + let mut lock = SRWLOCK_INIT; |
| 28 | + let mut condvar = CONDITION_VARIABLE_INIT; |
38 | 29 |
|
39 | 30 | let lock_ptr = SendPtr(&mut lock);
|
40 | 31 | let condvar_ptr = SendPtr(&mut condvar);
|
@@ -105,8 +96,8 @@ fn all_shared() {
|
105 | 96 | fn shared_sleep_and_exclusive_lock() {
|
106 | 97 | println!("shared_sleep_and_exclusive_lock");
|
107 | 98 |
|
108 |
| - let mut lock = null_mut(); |
109 |
| - let mut condvar = null_mut(); |
| 99 | + let mut lock = SRWLOCK_INIT; |
| 100 | + let mut condvar = CONDITION_VARIABLE_INIT; |
110 | 101 |
|
111 | 102 | let lock_ptr = SendPtr(&mut lock);
|
112 | 103 | let condvar_ptr = SendPtr(&mut condvar);
|
@@ -166,8 +157,8 @@ fn shared_sleep_and_exclusive_lock() {
|
166 | 157 | fn exclusive_sleep_and_shared_lock() {
|
167 | 158 | println!("exclusive_sleep_and_shared_lock");
|
168 | 159 |
|
169 |
| - let mut lock = null_mut(); |
170 |
| - let mut condvar = null_mut(); |
| 160 | + let mut lock = SRWLOCK_INIT; |
| 161 | + let mut condvar = CONDITION_VARIABLE_INIT; |
171 | 162 |
|
172 | 163 | let lock_ptr = SendPtr(&mut lock);
|
173 | 164 | let condvar_ptr = SendPtr(&mut condvar);
|
|
0 commit comments