mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-29 00:00:11 +02:00
chore: refactor runtime driver usage of Either (#2918)
This commit is contained in:
+45
-55
@@ -8,34 +8,38 @@ use std::time::Duration;
|
|||||||
// ===== io driver =====
|
// ===== io driver =====
|
||||||
|
|
||||||
cfg_io_driver! {
|
cfg_io_driver! {
|
||||||
type IoDriver = crate::park::either::Either<crate::io::driver::Driver, ParkThread>;
|
type IoDriver = crate::io::driver::Driver;
|
||||||
|
type IoStack = crate::park::either::Either<ProcessDriver, ParkThread>;
|
||||||
pub(crate) type IoHandle = Option<crate::io::driver::Handle>;
|
pub(crate) type IoHandle = Option<crate::io::driver::Handle>;
|
||||||
|
|
||||||
fn create_io_driver(enable: bool) -> io::Result<(IoDriver, IoHandle)> {
|
fn create_io_stack(enabled: bool) -> io::Result<(IoStack, IoHandle, SignalHandle)> {
|
||||||
use crate::park::either::Either;
|
use crate::park::either::Either;
|
||||||
|
|
||||||
#[cfg(loom)]
|
#[cfg(loom)]
|
||||||
assert!(!enable);
|
assert!(!enabled);
|
||||||
|
|
||||||
if enable {
|
let ret = if enabled {
|
||||||
let driver = crate::io::driver::Driver::new()?;
|
let io_driver = crate::io::driver::Driver::new()?;
|
||||||
let handle = driver.handle();
|
let io_handle = io_driver.handle();
|
||||||
|
|
||||||
Ok((Either::A(driver), Some(handle)))
|
let (signal_driver, signal_handle) = create_signal_driver(io_driver)?;
|
||||||
|
let process_driver = create_process_driver(signal_driver)?;
|
||||||
|
|
||||||
|
(Either::A(process_driver), Some(io_handle), signal_handle)
|
||||||
} else {
|
} else {
|
||||||
let driver = ParkThread::new();
|
(Either::B(ParkThread::new()), Default::default(), Default::default())
|
||||||
Ok((Either::B(driver), None))
|
};
|
||||||
}
|
|
||||||
|
Ok(ret)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_not_io_driver! {
|
cfg_not_io_driver! {
|
||||||
type IoDriver = ParkThread;
|
|
||||||
pub(crate) type IoHandle = ();
|
pub(crate) type IoHandle = ();
|
||||||
|
type IoStack = ParkThread;
|
||||||
|
|
||||||
fn create_io_driver(_enable: bool) -> io::Result<(IoDriver, IoHandle)> {
|
fn create_io_stack(_enabled: bool) -> io::Result<(IoStack, IoHandle, SignalHandle)> {
|
||||||
let driver = ParkThread::new();
|
Ok((ParkThread::new(), Default::default(), Default::default()))
|
||||||
Ok((driver, ()))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,64 +53,52 @@ macro_rules! cfg_signal_internal_and_unix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cfg_signal_internal_and_unix! {
|
cfg_signal_internal_and_unix! {
|
||||||
type SignalDriver = crate::park::either::Either<crate::signal::unix::driver::Driver, IoDriver>;
|
type SignalDriver = crate::signal::unix::driver::Driver;
|
||||||
pub(crate) type SignalHandle = Option<crate::signal::unix::driver::Handle>;
|
pub(crate) type SignalHandle = Option<crate::signal::unix::driver::Handle>;
|
||||||
|
|
||||||
fn create_signal_driver(io_driver: IoDriver) -> io::Result<(SignalDriver, SignalHandle)> {
|
fn create_signal_driver(io_driver: IoDriver) -> io::Result<(SignalDriver, SignalHandle)> {
|
||||||
use crate::park::either::Either;
|
let driver = crate::signal::unix::driver::Driver::new(io_driver)?;
|
||||||
|
let handle = driver.handle();
|
||||||
// Enable the signal driver if IO is also enabled
|
Ok((driver, Some(handle)))
|
||||||
match io_driver {
|
|
||||||
Either::A(io_driver) => {
|
|
||||||
let driver = crate::signal::unix::driver::Driver::new(io_driver)?;
|
|
||||||
let handle = driver.handle();
|
|
||||||
Ok((Either::A(driver), Some(handle)))
|
|
||||||
}
|
|
||||||
Either::B(_) => Ok((Either::B(io_driver), None)),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_not_signal_internal! {
|
cfg_not_signal_internal! {
|
||||||
type SignalDriver = IoDriver;
|
|
||||||
pub(crate) type SignalHandle = ();
|
pub(crate) type SignalHandle = ();
|
||||||
|
|
||||||
fn create_signal_driver(io_driver: IoDriver) -> io::Result<(SignalDriver, SignalHandle)> {
|
cfg_io_driver! {
|
||||||
Ok((io_driver, ()))
|
type SignalDriver = IoDriver;
|
||||||
|
|
||||||
|
fn create_signal_driver(io_driver: IoDriver) -> io::Result<(SignalDriver, SignalHandle)> {
|
||||||
|
Ok((io_driver, ()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== process driver =====
|
// ===== process driver =====
|
||||||
|
|
||||||
cfg_process_driver! {
|
cfg_process_driver! {
|
||||||
type ProcessDriver = crate::park::either::Either<crate::process::unix::driver::Driver, SignalDriver>;
|
type ProcessDriver = crate::process::unix::driver::Driver;
|
||||||
|
|
||||||
fn create_process_driver(signal_driver: SignalDriver) -> io::Result<ProcessDriver> {
|
fn create_process_driver(signal_driver: SignalDriver) -> io::Result<ProcessDriver> {
|
||||||
use crate::park::either::Either;
|
crate::process::unix::driver::Driver::new(signal_driver)
|
||||||
|
|
||||||
// Enable the signal driver if IO is also enabled
|
|
||||||
match signal_driver {
|
|
||||||
Either::A(signal_driver) => {
|
|
||||||
let driver = crate::process::unix::driver::Driver::new(signal_driver)?;
|
|
||||||
Ok(Either::A(driver))
|
|
||||||
}
|
|
||||||
Either::B(_) => Ok(Either::B(signal_driver)),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_not_process_driver! {
|
cfg_not_process_driver! {
|
||||||
type ProcessDriver = SignalDriver;
|
cfg_io_driver! {
|
||||||
|
type ProcessDriver = SignalDriver;
|
||||||
|
|
||||||
fn create_process_driver(signal_driver: SignalDriver) -> io::Result<ProcessDriver> {
|
fn create_process_driver(signal_driver: SignalDriver) -> io::Result<ProcessDriver> {
|
||||||
Ok(signal_driver)
|
Ok(signal_driver)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== time driver =====
|
// ===== time driver =====
|
||||||
|
|
||||||
cfg_time! {
|
cfg_time! {
|
||||||
type TimeDriver = crate::park::either::Either<crate::time::driver::Driver<ProcessDriver>, ProcessDriver>;
|
type TimeDriver = crate::park::either::Either<crate::time::driver::Driver<IoStack>, IoStack>;
|
||||||
|
|
||||||
pub(crate) type Clock = crate::time::Clock;
|
pub(crate) type Clock = crate::time::Clock;
|
||||||
pub(crate) type TimeHandle = Option<crate::time::driver::Handle>;
|
pub(crate) type TimeHandle = Option<crate::time::driver::Handle>;
|
||||||
@@ -117,24 +109,24 @@ cfg_time! {
|
|||||||
|
|
||||||
fn create_time_driver(
|
fn create_time_driver(
|
||||||
enable: bool,
|
enable: bool,
|
||||||
process_driver: ProcessDriver,
|
io_stack: IoStack,
|
||||||
clock: Clock,
|
clock: Clock,
|
||||||
) -> (TimeDriver, TimeHandle) {
|
) -> (TimeDriver, TimeHandle) {
|
||||||
use crate::park::either::Either;
|
use crate::park::either::Either;
|
||||||
|
|
||||||
if enable {
|
if enable {
|
||||||
let driver = crate::time::driver::Driver::new(process_driver, clock);
|
let driver = crate::time::driver::Driver::new(io_stack, clock);
|
||||||
let handle = driver.handle();
|
let handle = driver.handle();
|
||||||
|
|
||||||
(Either::A(driver), Some(handle))
|
(Either::A(driver), Some(handle))
|
||||||
} else {
|
} else {
|
||||||
(Either::B(process_driver), None)
|
(Either::B(io_stack), None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_not_time! {
|
cfg_not_time! {
|
||||||
type TimeDriver = ProcessDriver;
|
type TimeDriver = IoStack;
|
||||||
|
|
||||||
pub(crate) type Clock = ();
|
pub(crate) type Clock = ();
|
||||||
pub(crate) type TimeHandle = ();
|
pub(crate) type TimeHandle = ();
|
||||||
@@ -145,10 +137,10 @@ cfg_not_time! {
|
|||||||
|
|
||||||
fn create_time_driver(
|
fn create_time_driver(
|
||||||
_enable: bool,
|
_enable: bool,
|
||||||
process_driver: ProcessDriver,
|
io_stack: IoStack,
|
||||||
_clock: Clock,
|
_clock: Clock,
|
||||||
) -> (TimeDriver, TimeHandle) {
|
) -> (TimeDriver, TimeHandle) {
|
||||||
(process_driver, ())
|
(io_stack, ())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,13 +165,11 @@ pub(crate) struct Cfg {
|
|||||||
|
|
||||||
impl Driver {
|
impl Driver {
|
||||||
pub(crate) fn new(cfg: Cfg) -> io::Result<(Self, Resources)> {
|
pub(crate) fn new(cfg: Cfg) -> io::Result<(Self, Resources)> {
|
||||||
let clock = create_clock();
|
let (io_stack, io_handle, signal_handle) = create_io_stack(cfg.enable_io)?;
|
||||||
|
|
||||||
let (io_driver, io_handle) = create_io_driver(cfg.enable_io)?;
|
let clock = create_clock();
|
||||||
let (signal_driver, signal_handle) = create_signal_driver(io_driver)?;
|
|
||||||
let process_driver = create_process_driver(signal_driver)?;
|
|
||||||
let (time_driver, time_handle) =
|
let (time_driver, time_handle) =
|
||||||
create_time_driver(cfg.enable_time, process_driver, clock.clone());
|
create_time_driver(cfg.enable_time, io_stack, clock.clone());
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
Self { inner: time_driver },
|
Self { inner: time_driver },
|
||||||
|
|||||||
@@ -184,9 +184,9 @@ impl<L: Link> fmt::Debug for LinkedList<L, L::Target> {
|
|||||||
|
|
||||||
#[cfg(any(
|
#[cfg(any(
|
||||||
feature = "fs",
|
feature = "fs",
|
||||||
feature = "sync",
|
all(unix, feature = "process"),
|
||||||
feature = "signal",
|
feature = "signal",
|
||||||
feature = "process"
|
feature = "sync",
|
||||||
))]
|
))]
|
||||||
impl<L: Link> LinkedList<L, L::Target> {
|
impl<L: Link> LinkedList<L, L::Target> {
|
||||||
pub(crate) fn last(&self) -> Option<&L::Target> {
|
pub(crate) fn last(&self) -> Option<&L::Target> {
|
||||||
|
|||||||
Reference in New Issue
Block a user