mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Add an option to run rustbuild on low priority
This is a resurrection of #40776, combining their Windows setup with an additional setup on Unix to set the program group's niceness to +10 (low-but-not-lowest priority) when the `low_priority` option is on.
This commit is contained in:
parent
4d09a0eb5d
commit
1a7375b7e0
@ -94,6 +94,7 @@ pub struct Config {
|
|||||||
pub backtrace: bool, // support for RUST_BACKTRACE
|
pub backtrace: bool, // support for RUST_BACKTRACE
|
||||||
|
|
||||||
// misc
|
// misc
|
||||||
|
pub low_priority: bool,
|
||||||
pub channel: String,
|
pub channel: String,
|
||||||
pub quiet_tests: bool,
|
pub quiet_tests: bool,
|
||||||
// Fallback musl-root for all targets
|
// Fallback musl-root for all targets
|
||||||
@ -146,6 +147,7 @@ struct Build {
|
|||||||
target: Vec<String>,
|
target: Vec<String>,
|
||||||
cargo: Option<String>,
|
cargo: Option<String>,
|
||||||
rustc: Option<String>,
|
rustc: Option<String>,
|
||||||
|
low_priority: Option<bool>,
|
||||||
compiler_docs: Option<bool>,
|
compiler_docs: Option<bool>,
|
||||||
docs: Option<bool>,
|
docs: Option<bool>,
|
||||||
submodules: Option<bool>,
|
submodules: Option<bool>,
|
||||||
@ -302,6 +304,7 @@ impl Config {
|
|||||||
config.nodejs = build.nodejs.map(PathBuf::from);
|
config.nodejs = build.nodejs.map(PathBuf::from);
|
||||||
config.gdb = build.gdb.map(PathBuf::from);
|
config.gdb = build.gdb.map(PathBuf::from);
|
||||||
config.python = build.python.map(PathBuf::from);
|
config.python = build.python.map(PathBuf::from);
|
||||||
|
set(&mut config.low_priority, build.low_priority);
|
||||||
set(&mut config.compiler_docs, build.compiler_docs);
|
set(&mut config.compiler_docs, build.compiler_docs);
|
||||||
set(&mut config.docs, build.docs);
|
set(&mut config.docs, build.docs);
|
||||||
set(&mut config.submodules, build.submodules);
|
set(&mut config.submodules, build.submodules);
|
||||||
|
@ -152,6 +152,9 @@
|
|||||||
# known-good version of OpenSSL, compile it, and link it to Cargo.
|
# known-good version of OpenSSL, compile it, and link it to Cargo.
|
||||||
#openssl-static = false
|
#openssl-static = false
|
||||||
|
|
||||||
|
# Run the build with low priority
|
||||||
|
#low_priority = false
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# General install configuration options
|
# General install configuration options
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
use std::env;
|
use std::env;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
use Build;
|
||||||
|
|
||||||
type HANDLE = *mut u8;
|
type HANDLE = *mut u8;
|
||||||
type BOOL = i32;
|
type BOOL = i32;
|
||||||
@ -60,8 +61,10 @@ const DUPLICATE_SAME_ACCESS: DWORD = 0x2;
|
|||||||
const PROCESS_DUP_HANDLE: DWORD = 0x40;
|
const PROCESS_DUP_HANDLE: DWORD = 0x40;
|
||||||
const JobObjectExtendedLimitInformation: JOBOBJECTINFOCLASS = 9;
|
const JobObjectExtendedLimitInformation: JOBOBJECTINFOCLASS = 9;
|
||||||
const JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE: DWORD = 0x2000;
|
const JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE: DWORD = 0x2000;
|
||||||
|
const JOB_OBJECT_LIMIT_PRIORITY_CLASS: DWORD = 0x00000020;
|
||||||
const SEM_FAILCRITICALERRORS: UINT = 0x0001;
|
const SEM_FAILCRITICALERRORS: UINT = 0x0001;
|
||||||
const SEM_NOGPFAULTERRORBOX: UINT = 0x0002;
|
const SEM_NOGPFAULTERRORBOX: UINT = 0x0002;
|
||||||
|
const BELOW_NORMAL_PRIORITY_CLASS: DWORD = 0x00004000;
|
||||||
|
|
||||||
extern "system" {
|
extern "system" {
|
||||||
fn CreateJobObjectW(lpJobAttributes: *mut u8, lpName: *const u8) -> HANDLE;
|
fn CreateJobObjectW(lpJobAttributes: *mut u8, lpName: *const u8) -> HANDLE;
|
||||||
@ -118,7 +121,7 @@ struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
|
|||||||
SchedulingClass: DWORD,
|
SchedulingClass: DWORD,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn setup() {
|
pub unsafe fn setup(build: &mut Build) {
|
||||||
// Tell Windows to not show any UI on errors (such as not finding a required dll
|
// Tell Windows to not show any UI on errors (such as not finding a required dll
|
||||||
// during startup or terminating abnormally). This is important for running tests,
|
// during startup or terminating abnormally). This is important for running tests,
|
||||||
// since some of them use abnormal termination by design.
|
// since some of them use abnormal termination by design.
|
||||||
@ -136,6 +139,10 @@ pub unsafe fn setup() {
|
|||||||
// children will reside in the job by default.
|
// children will reside in the job by default.
|
||||||
let mut info = mem::zeroed::<JOBOBJECT_EXTENDED_LIMIT_INFORMATION>();
|
let mut info = mem::zeroed::<JOBOBJECT_EXTENDED_LIMIT_INFORMATION>();
|
||||||
info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
||||||
|
if build.config.low_priority {
|
||||||
|
info.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_PRIORITY_CLASS;
|
||||||
|
info.BasicLimitInformation.PriorityClass = BELOW_NORMAL_PRIORITY_CLASS;
|
||||||
|
}
|
||||||
let r = SetInformationJobObject(job,
|
let r = SetInformationJobObject(job,
|
||||||
JobObjectExtendedLimitInformation,
|
JobObjectExtendedLimitInformation,
|
||||||
&mut info as *mut _ as LPVOID,
|
&mut info as *mut _ as LPVOID,
|
||||||
|
@ -76,6 +76,9 @@ extern crate num_cpus;
|
|||||||
extern crate rustc_serialize;
|
extern crate rustc_serialize;
|
||||||
extern crate toml;
|
extern crate toml;
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
extern crate libc;
|
||||||
|
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::env;
|
use std::env;
|
||||||
@ -108,9 +111,29 @@ pub mod util;
|
|||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
mod job;
|
mod job;
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
#[cfg(unix)]
|
||||||
mod job {
|
mod job {
|
||||||
pub unsafe fn setup() {}
|
use libc;
|
||||||
|
|
||||||
|
//apparently glibc defines their own enum for this parameter, in a different type
|
||||||
|
#[cfg(not(any(target_env = "musl", target_env = "musleabi", target_env = "musleabihf",
|
||||||
|
target_os = "emscripten", target_arch = "mips", target_arch = "mipsel")))]
|
||||||
|
const PRIO_PGRP: libc::c_uint = libc::PRIO_PGRP as libc::c_uint;
|
||||||
|
#[cfg(any(target_env = "musl", target_env = "musleabi", target_env = "musleabihf",
|
||||||
|
target_os = "emscripten", target_arch = "mips", target_arch = "mipsel"))]
|
||||||
|
const PRIO_PGRP: libc::c_int = libc::PRIO_PGRP;
|
||||||
|
|
||||||
|
pub unsafe fn setup(build: &mut ::Build) {
|
||||||
|
if build.config.low_priority {
|
||||||
|
libc::setpriority(PRIO_PGRP, 0, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(unix, windows)))]
|
||||||
|
mod job {
|
||||||
|
pub unsafe fn setup(_build: &mut ::Build) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use config::Config;
|
pub use config::Config;
|
||||||
@ -263,7 +286,7 @@ impl Build {
|
|||||||
/// Executes the entire build, as configured by the flags and configuration.
|
/// Executes the entire build, as configured by the flags and configuration.
|
||||||
pub fn build(&mut self) {
|
pub fn build(&mut self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
job::setup();
|
job::setup(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Subcommand::Clean = self.flags.cmd {
|
if let Subcommand::Clean = self.flags.cmd {
|
||||||
|
Loading…
Reference in New Issue
Block a user