migrate compiler, bootstrap, and compiletest to windows-rs
This commit is contained in:
parent
13b7aa4d7f
commit
bb7c373fdf
22 changed files with 381 additions and 282 deletions
|
@ -25,8 +25,14 @@ termize = "0.1.1"
|
|||
serde = { version = "1.0.125", features = [ "derive" ] }
|
||||
serde_json = "1.0.59"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
winapi = { version = "0.3", features = [ "handleapi", "synchapi", "winbase" ] }
|
||||
[target.'cfg(windows)'.dependencies.windows]
|
||||
version = "0.46.0"
|
||||
features = [
|
||||
"Win32_Foundation",
|
||||
"Win32_Security",
|
||||
"Win32_System_Threading",
|
||||
"Win32_System_WindowsProgramming",
|
||||
]
|
||||
|
||||
[features]
|
||||
rustc_use_parallel_compiler = ['rustc_error_messages/rustc_use_parallel_compiler']
|
||||
|
|
|
@ -16,10 +16,12 @@ pub fn acquire_global_lock(name: &str) -> Box<dyn Any> {
|
|||
use std::ffi::CString;
|
||||
use std::io;
|
||||
|
||||
use winapi::shared::ntdef::HANDLE;
|
||||
use winapi::um::handleapi::CloseHandle;
|
||||
use winapi::um::synchapi::{CreateMutexA, ReleaseMutex, WaitForSingleObject};
|
||||
use winapi::um::winbase::{INFINITE, WAIT_ABANDONED, WAIT_OBJECT_0};
|
||||
use windows::{
|
||||
core::PCSTR,
|
||||
Win32::Foundation::{CloseHandle, HANDLE, WAIT_ABANDONED, WAIT_OBJECT_0},
|
||||
Win32::System::Threading::{CreateMutexA, ReleaseMutex, WaitForSingleObject},
|
||||
Win32::System::WindowsProgramming::INFINITE,
|
||||
};
|
||||
|
||||
struct Handle(HANDLE);
|
||||
|
||||
|
@ -42,49 +44,38 @@ pub fn acquire_global_lock(name: &str) -> Box<dyn Any> {
|
|||
}
|
||||
|
||||
let cname = CString::new(name).unwrap();
|
||||
unsafe {
|
||||
// Create a named mutex, with no security attributes and also not
|
||||
// acquired when we create it.
|
||||
//
|
||||
// This will silently create one if it doesn't already exist, or it'll
|
||||
// open up a handle to one if it already exists.
|
||||
let mutex = CreateMutexA(std::ptr::null_mut(), 0, cname.as_ptr());
|
||||
if mutex.is_null() {
|
||||
panic!(
|
||||
"failed to create global mutex named `{}`: {}",
|
||||
name,
|
||||
io::Error::last_os_error()
|
||||
);
|
||||
}
|
||||
let mutex = Handle(mutex);
|
||||
// Create a named mutex, with no security attributes and also not
|
||||
// acquired when we create it.
|
||||
//
|
||||
// This will silently create one if it doesn't already exist, or it'll
|
||||
// open up a handle to one if it already exists.
|
||||
let mutex = unsafe { CreateMutexA(None, false, PCSTR::from_raw(cname.as_ptr().cast())) }
|
||||
.unwrap_or_else(|_| panic!("failed to create global mutex named `{}`", name));
|
||||
let mutex = Handle(mutex);
|
||||
|
||||
// Acquire the lock through `WaitForSingleObject`.
|
||||
//
|
||||
// A return value of `WAIT_OBJECT_0` means we successfully acquired it.
|
||||
//
|
||||
// A return value of `WAIT_ABANDONED` means that the previous holder of
|
||||
// the thread exited without calling `ReleaseMutex`. This can happen,
|
||||
// for example, when the compiler crashes or is interrupted via ctrl-c
|
||||
// or the like. In this case, however, we are still transferred
|
||||
// ownership of the lock so we continue.
|
||||
//
|
||||
// If an error happens.. well... that's surprising!
|
||||
match WaitForSingleObject(mutex.0, INFINITE) {
|
||||
WAIT_OBJECT_0 | WAIT_ABANDONED => {}
|
||||
code => {
|
||||
panic!(
|
||||
"WaitForSingleObject failed on global mutex named \
|
||||
`{}`: {} (ret={:x})",
|
||||
name,
|
||||
io::Error::last_os_error(),
|
||||
code
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Return a guard which will call `ReleaseMutex` when dropped.
|
||||
Box::new(Guard(mutex))
|
||||
// Acquire the lock through `WaitForSingleObject`.
|
||||
//
|
||||
// A return value of `WAIT_OBJECT_0` means we successfully acquired it.
|
||||
//
|
||||
// A return value of `WAIT_ABANDONED` means that the previous holder of
|
||||
// the thread exited without calling `ReleaseMutex`. This can happen,
|
||||
// for example, when the compiler crashes or is interrupted via ctrl-c
|
||||
// or the like. In this case, however, we are still transferred
|
||||
// ownership of the lock so we continue.
|
||||
//
|
||||
// If an error happens.. well... that's surprising!
|
||||
match unsafe { WaitForSingleObject(mutex.0, INFINITE) } {
|
||||
WAIT_OBJECT_0 | WAIT_ABANDONED => (),
|
||||
err => panic!(
|
||||
"WaitForSingleObject failed on global mutex named `{}`: {} (ret={:x})",
|
||||
name,
|
||||
io::Error::last_os_error(),
|
||||
err.0
|
||||
),
|
||||
}
|
||||
|
||||
// Return a guard which will call `ReleaseMutex` when dropped.
|
||||
Box::new(Guard(mutex))
|
||||
}
|
||||
|
||||
#[cfg(not(windows))]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue