summaryrefslogtreecommitdiffstats
path: root/tokio/src/runtime/builder.rs
diff options
context:
space:
mode:
authorIvan Petkov <ivanppetkov@gmail.com>2020-09-22 15:40:44 -0700
committerGitHub <noreply@github.com>2020-09-22 15:40:44 -0700
commit7ae5b7bd4f93612f91ab504ffb63aa8241c1d7bb (patch)
tree990e22703eb7103b030f5e8bf117557684a9f205 /tokio/src/runtime/builder.rs
parente09b90ea32385337170ce17eb55ab372f9388af5 (diff)
signal: move driver to runtime thread (#2835)
Refactors the signal infrastructure to move the driver to the runtime thread. This follows the model put forth by the I/O driver and time driver.
Diffstat (limited to 'tokio/src/runtime/builder.rs')
-rw-r--r--tokio/src/runtime/builder.rs47
1 files changed, 23 insertions, 24 deletions
diff --git a/tokio/src/runtime/builder.rs b/tokio/src/runtime/builder.rs
index 42aed3e9..4072b04e 100644
--- a/tokio/src/runtime/builder.rs
+++ b/tokio/src/runtime/builder.rs
@@ -1,7 +1,7 @@
use crate::loom::sync::Mutex;
use crate::runtime::handle::Handle;
use crate::runtime::shell::Shell;
-use crate::runtime::{blocking, io, time, Callback, Runtime, Spawner};
+use crate::runtime::{blocking, driver, io, Callback, Runtime, Spawner};
use std::fmt;
#[cfg(feature = "blocking")]
@@ -359,14 +359,17 @@ impl Builder {
}
}
+ fn get_cfg(&self) -> driver::Cfg {
+ driver::Cfg {
+ enable_io: self.enable_io,
+ enable_time: self.enable_time,
+ }
+ }
+
fn build_shell_runtime(&mut self) -> io::Result<Runtime> {
use crate::runtime::Kind;
- let clock = time::create_clock();
-
- // Create I/O driver
- let (io_driver, io_handle) = io::create_driver(self.enable_io)?;
- let (driver, time_handle) = time::create_driver(self.enable_time, io_driver, clock.clone());
+ let (driver, resources) = driver::Driver::new(self.get_cfg())?;
let spawner = Spawner::Shell;
@@ -377,9 +380,10 @@ impl Builder {
kind: Kind::Shell(Mutex::new(Some(Shell::new(driver)))),
handle: Handle {
spawner,
- io_handle,
- time_handle,
- clock,
+ io_handle: resources.io_handle,
+ time_handle: resources.time_handle,
+ signal_handle: resources.signal_handle,
+ clock: resources.clock,
blocking_spawner,
},
blocking_pool,
@@ -478,12 +482,7 @@ cfg_rt_core! {
fn build_basic_runtime(&mut self) -> io::Result<Runtime> {
use crate::runtime::{BasicScheduler, Kind};
- let clock = time::create_clock();
-
- // Create I/O driver
- let (io_driver, io_handle) = io::create_driver(self.enable_io)?;
-
- let (driver, time_handle) = time::create_driver(self.enable_time, io_driver, clock.clone());
+ let (driver, resources) = driver::Driver::new(self.get_cfg())?;
// And now put a single-threaded scheduler on top of the timer. When
// there are no futures ready to do something, it'll let the timer or
@@ -500,9 +499,10 @@ cfg_rt_core! {
kind: Kind::Basic(Mutex::new(Some(scheduler))),
handle: Handle {
spawner,
- io_handle,
- time_handle,
- clock,
+ io_handle: resources.io_handle,
+ time_handle: resources.time_handle,
+ signal_handle: resources.signal_handle,
+ clock: resources.clock,
blocking_spawner,
},
blocking_pool,
@@ -533,10 +533,8 @@ cfg_rt_threaded! {
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();
+ let (driver, resources) = driver::Driver::new(self.get_cfg())?;
- let (io_driver, io_handle) = io::create_driver(self.enable_io)?;
- let (driver, time_handle) = time::create_driver(self.enable_time, io_driver, clock.clone());
let (scheduler, launch) = ThreadPool::new(core_threads, Parker::new(driver));
let spawner = Spawner::ThreadPool(scheduler.spawner().clone());
@@ -547,9 +545,10 @@ cfg_rt_threaded! {
// Create the runtime handle
let handle = Handle {
spawner,
- io_handle,
- time_handle,
- clock,
+ io_handle: resources.io_handle,
+ time_handle: resources.time_handle,
+ signal_handle: resources.signal_handle,
+ clock: resources.clock,
blocking_spawner,
};