1
Fork 0

run rustdoc tests in the same sort of thread rustc runs in

This commit is contained in:
Niko Matsakis 2017-01-17 18:15:08 -05:00
parent 8780962828
commit d25f066c07
2 changed files with 49 additions and 30 deletions

View file

@ -82,6 +82,7 @@ use rustc::util::common::time;
use serialize::json::ToJson; use serialize::json::ToJson;
use std::any::Any;
use std::cmp::max; use std::cmp::max;
use std::cmp::Ordering::Equal; use std::cmp::Ordering::Equal;
use std::default::Default; use std::default::Default;
@ -1018,15 +1019,34 @@ fn parse_crate_attrs<'a>(sess: &'a Session, input: &Input) -> PResult<'a, Vec<as
} }
} }
/// Runs `f` in a suitable thread for running `rustc`; returns a
/// `Result` with either the return value of `f` or -- if a panic
/// occurs -- the panic value.
pub fn in_rustc_thread<F, R>(f: F) -> Result<R, Box<Any + Send>>
where F: FnOnce() -> R + Send + 'static,
R: Send + 'static,
{
// Temporarily have stack size set to 16MB to deal with nom-using crates failing
const STACK_SIZE: usize = 16 * 1024 * 1024; // 16MB
let mut cfg = thread::Builder::new().name("rustc".to_string());
// FIXME: Hacks on hacks. If the env is trying to override the stack size
// then *don't* set it explicitly.
if env::var_os("RUST_MIN_STACK").is_none() {
cfg = cfg.stack_size(STACK_SIZE);
}
let thread = cfg.spawn(f);
thread.unwrap().join()
}
/// Run a procedure which will detect panics in the compiler and print nicer /// Run a procedure which will detect panics in the compiler and print nicer
/// error messages rather than just failing the test. /// error messages rather than just failing the test.
/// ///
/// The diagnostic emitter yielded to the procedure should be used for reporting /// The diagnostic emitter yielded to the procedure should be used for reporting
/// errors of the compiler. /// errors of the compiler.
pub fn monitor<F: FnOnce() + Send + 'static>(f: F) { pub fn monitor<F: FnOnce() + Send + 'static>(f: F) {
// Temporarily have stack size set to 16MB to deal with nom-using crates failing
const STACK_SIZE: usize = 16 * 1024 * 1024; // 16MB
struct Sink(Arc<Mutex<Vec<u8>>>); struct Sink(Arc<Mutex<Vec<u8>>>);
impl Write for Sink { impl Write for Sink {
fn write(&mut self, data: &[u8]) -> io::Result<usize> { fn write(&mut self, data: &[u8]) -> io::Result<usize> {
@ -1040,20 +1060,12 @@ pub fn monitor<F: FnOnce() + Send + 'static>(f: F) {
let data = Arc::new(Mutex::new(Vec::new())); let data = Arc::new(Mutex::new(Vec::new()));
let err = Sink(data.clone()); let err = Sink(data.clone());
let mut cfg = thread::Builder::new().name("rustc".to_string()); let result = in_rustc_thread(move || {
io::set_panic(Some(box err));
f()
});
// FIXME: Hacks on hacks. If the env is trying to override the stack size if let Err(value) = result {
// then *don't* set it explicitly.
if env::var_os("RUST_MIN_STACK").is_none() {
cfg = cfg.stack_size(STACK_SIZE);
}
let thread = cfg.spawn(move || {
io::set_panic(Some(box err));
f()
});
if let Err(value) = thread.unwrap().join() {
// Thread panicked without emitting a fatal diagnostic // Thread panicked without emitting a fatal diagnostic
if !value.is::<errors::FatalError>() { if !value.is::<errors::FatalError>() {
let emitter = let emitter =

View file

@ -29,7 +29,7 @@ use rustc::session::config::{OutputType, OutputTypes, Externs};
use rustc::session::search_paths::{SearchPaths, PathKind}; use rustc::session::search_paths::{SearchPaths, PathKind};
use rustc_back::dynamic_lib::DynamicLibrary; use rustc_back::dynamic_lib::DynamicLibrary;
use rustc_back::tempdir::TempDir; use rustc_back::tempdir::TempDir;
use rustc_driver::{driver, Compilation}; use rustc_driver::{self, driver, Compilation};
use rustc_driver::driver::phase_2_configure_and_expand; use rustc_driver::driver::phase_2_configure_and_expand;
use rustc_metadata::cstore::CStore; use rustc_metadata::cstore::CStore;
use rustc_resolve::MakeGlobMap; use rustc_resolve::MakeGlobMap;
@ -428,19 +428,26 @@ impl Collector {
should_panic: testing::ShouldPanic::No, should_panic: testing::ShouldPanic::No,
}, },
testfn: testing::DynTestFn(box move |()| { testfn: testing::DynTestFn(box move |()| {
runtest(&test, match {
&cratename, rustc_driver::in_rustc_thread(move || {
cfgs, runtest(&test,
libs, &cratename,
externs, cfgs,
should_panic, libs,
no_run, externs,
as_test_harness, should_panic,
compile_fail, no_run,
error_codes, as_test_harness,
&opts, compile_fail,
maybe_sysroot); error_codes,
}) &opts,
maybe_sysroot)
})
} {
Ok(()) => (),
Err(err) => panic::resume_unwind(err),
}
}),
}); });
} }