compiletest: Run tests in their own thread to avoid blocking the scheduler
The calls to waitpid are interacting badly with the message passing that goes on between schedulers and causing us to have very little parallelism in the test suite. I don't fully understand the sequence of events that causes the problem here but clearly blocking on waitpid is something that a well-behaved task should not be doing. Unfortunately this adds quite a bit of overhead to each test: one thread, two tasks, three stacks, so there's a tradeoff. The time to execute run-pass on my 4-core machine goes from ~750s to ~300s.
This commit is contained in:
parent
0d817ee869
commit
15fca2dad7
1 changed files with 16 additions and 2 deletions
|
|
@ -20,16 +20,30 @@ use procsrv;
|
|||
use util;
|
||||
use util::logv;
|
||||
|
||||
use std::cell::Cell;
|
||||
use std::io;
|
||||
use std::os;
|
||||
use std::str;
|
||||
use std::task::{spawn_sched, SingleThreaded};
|
||||
use std::vec;
|
||||
|
||||
use extra::test::MetricMap;
|
||||
|
||||
pub fn run(config: config, testfile: ~str) {
|
||||
let mut _mm = MetricMap::new();
|
||||
run_metrics(config, testfile, &mut _mm);
|
||||
let config = Cell::new(config);
|
||||
let testfile = Cell::new(testfile);
|
||||
// FIXME #6436: Creating another thread to run the test because this
|
||||
// is going to call waitpid. The new scheduler has some strange
|
||||
// interaction between the blocking tasks and 'friend' schedulers
|
||||
// that destroys parallelism if we let normal schedulers block.
|
||||
// It should be possible to remove this spawn once std::run is
|
||||
// rewritten to be non-blocking.
|
||||
do spawn_sched(SingleThreaded) {
|
||||
let config = config.take();
|
||||
let testfile = testfile.take();
|
||||
let mut _mm = MetricMap::new();
|
||||
run_metrics(config, testfile, &mut _mm);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run_metrics(config: config, testfile: ~str, mm: &mut MetricMap) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue