From 1bf1928088e5cc545eee447b38da7a785099059f Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Tue, 28 Apr 2020 15:04:41 -0700 Subject: [PATCH] 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 --- tokio/src/runtime/builder.rs | 4 +++- tokio/tests/rt_threaded.rs | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/tokio/src/runtime/builder.rs b/tokio/src/runtime/builder.rs index 56fb898ad..7c7b2d3f0 100644 --- a/tokio/src/runtime/builder.rs +++ b/tokio/src/runtime/builder.rs @@ -461,10 +461,12 @@ cfg_rt_threaded! { } fn build_threaded_runtime(&mut self) -> io::Result { + 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(); diff --git a/tokio/tests/rt_threaded.rs b/tokio/tests/rt_threaded.rs index 9c95afd5a..ad063348f 100644 --- a/tokio/tests/rt_threaded.rs +++ b/tokio/tests/rt_threaded.rs @@ -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() }