mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-09-28 12:10:37 +00:00
rt: fix default thread number logic (#2457)
Previously, the function picking the default number of threads for the threaded runtime did not factor in `max_threads`. Instead, it only used the value returned by `num_cpus`. However, if `num_cpus` returns a value greater than `max_threads`, then the function would panic. This patch fixes the function by limiting the default number of threads by `max_threads`. Fixes #2452
This commit is contained in:
parent
a26d3aec96
commit
1bf1928088
@ -461,10 +461,12 @@ cfg_rt_threaded! {
|
||||
}
|
||||
|
||||
fn build_threaded_runtime(&mut self) -> io::Result<Runtime> {
|
||||
use crate::loom::sys::num_cpus;
|
||||
use crate::runtime::{Kind, ThreadPool};
|
||||
use crate::runtime::park::Parker;
|
||||
use std::cmp;
|
||||
|
||||
let core_threads = self.core_threads.unwrap_or_else(crate::loom::sys::num_cpus);
|
||||
let core_threads = self.core_threads.unwrap_or_else(|| cmp::min(self.max_threads, num_cpus()));
|
||||
assert!(core_threads <= self.max_threads, "Core threads number cannot be above max limit");
|
||||
|
||||
let clock = time::create_clock();
|
||||
|
@ -322,6 +322,16 @@ fn multi_threadpool() {
|
||||
done_rx.recv().unwrap();
|
||||
}
|
||||
|
||||
// Testing this does not panic
|
||||
#[test]
|
||||
fn max_threads() {
|
||||
let _rt = tokio::runtime::Builder::new()
|
||||
.threaded_scheduler()
|
||||
.max_threads(1)
|
||||
.build()
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn rt() -> Runtime {
|
||||
Runtime::new().unwrap()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user