[libtest] Run the test synchronously when hitting thread limit

This commit is contained in:
hyd-dev 2021-01-30 00:23:56 +08:00
parent 099f27b6cb
commit 43aed7441e
No known key found for this signature in database
GPG Key ID: 74FA7FD5B8DA14B8
3 changed files with 35 additions and 1 deletions

View File

@ -506,7 +506,18 @@ pub fn run_test(
let supports_threads = !cfg!(target_os = "emscripten") && !cfg!(target_arch = "wasm32");
if concurrency == Concurrent::Yes && supports_threads {
let cfg = thread::Builder::new().name(name.as_slice().to_owned());
Some(cfg.spawn(runtest).unwrap())
let mut runtest = Arc::new(Mutex::new(Some(runtest)));
let runtest2 = runtest.clone();
match cfg.spawn(move || runtest2.lock().unwrap().take().unwrap()()) {
Ok(handle) => Some(handle),
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
// `ErrorKind::WouldBlock` means hitting the thread limit on some
// platforms, so run the test synchronously here instead.
Arc::get_mut(&mut runtest).unwrap().get_mut().unwrap().take().unwrap()();
None
}
Err(e) => panic!("failed to spawn thread to run test: {}", e),
}
} else {
runtest();
None

View File

@ -0,0 +1,7 @@
-include ../../run-make-fulldeps/tools.mk
# only-linux
all:
$(RUSTC) test.rs --test --target $(TARGET)
$(shell ulimit -p 0 && $(call RUN,test))

View File

@ -0,0 +1,16 @@
#![feature(once_cell)]
use std::{io::ErrorKind, lazy::SyncOnceCell, thread::{self, Builder, ThreadId}};
static THREAD_ID: SyncOnceCell<ThreadId> = SyncOnceCell::new();
#[test]
fn spawn_thread_would_block() {
assert_eq!(Builder::new().spawn(|| unreachable!()).unwrap_err().kind(), ErrorKind::WouldBlock);
THREAD_ID.set(thread::current().id()).unwrap();
}
#[test]
fn run_in_same_thread() {
assert_eq!(*THREAD_ID.get().unwrap(), thread::current().id());
}