Skip to content

Commit 29b9547

Browse files
committed
Disable thread support in libtest if RUST_TEST_THREADS=1
1 parent 7d4df2d commit 29b9547

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

library/test/src/helpers/concurrency.rs

+24-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,30 @@
33
use std::{env, num::NonZeroUsize, thread};
44

55
pub fn get_concurrency() -> usize {
6-
if let Ok(value) = env::var("RUST_TEST_THREADS") {
7-
match value.parse::<NonZeroUsize>().ok() {
8-
Some(n) => n.get(),
9-
_ => panic!("RUST_TEST_THREADS is `{value}`, should be a positive integer."),
10-
}
6+
rust_test_threads_from_env()
7+
.unwrap_or_else(|| thread::available_parallelism().map(|n| n.get()).unwrap_or(1))
8+
}
9+
10+
pub fn supports_threads() -> bool {
11+
if cfg!(target_os = "emscripten") || cfg!(target_family = "wasm") {
12+
return false;
13+
}
14+
15+
// Accommodate libraries that may rely on shared thread-local storage (e.g.
16+
// integrating with old C libraries).
17+
if let Some(1) = rust_test_threads_from_env() {
18+
return false;
19+
}
20+
21+
true
22+
}
23+
24+
fn rust_test_threads_from_env() -> Option<usize> {
25+
let value = env::var("RUST_TEST_THREADS").ok()?;
26+
27+
if let Ok(value) = value.parse::<NonZeroUsize>() {
28+
Some(value.get())
1129
} else {
12-
thread::available_parallelism().map(|n| n.get()).unwrap_or(1)
30+
panic!("RUST_TEST_THREADS is `{value}`, should be a positive integer.", value = value)
1331
}
1432
}

library/test/src/lib.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ mod tests;
8282

8383
use core::any::Any;
8484
use event::{CompletedTest, TestEvent};
85-
use helpers::concurrency::get_concurrency;
85+
use helpers::concurrency::{get_concurrency, supports_threads};
8686
use helpers::exit_code::get_exit_code;
8787
use helpers::shuffle::{get_shuffle_seed, shuffle_tests};
8888
use options::RunStrategy;
@@ -592,8 +592,7 @@ pub fn run_test(
592592
// If the platform is single-threaded we're just going to run
593593
// the test synchronously, regardless of the concurrency
594594
// level.
595-
let supports_threads = !cfg!(target_os = "emscripten") && !cfg!(target_family = "wasm");
596-
if supports_threads {
595+
if supports_threads() {
597596
let cfg = thread::Builder::new().name(name.as_slice().to_owned());
598597
let mut runtest = Arc::new(Mutex::new(Some(runtest)));
599598
let runtest2 = runtest.clone();

0 commit comments

Comments
 (0)