chore: refactor runtime driver usage of Either (#2918)

This commit is contained in:
Ivan Petkov
2020-10-12 19:57:22 +00:00
committed by GitHub
parent 07802b2c84
commit 24d0a0cfa8
2 changed files with 47 additions and 57 deletions
+45 -55
View File
@@ -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 },
+2 -2
View File
@@ -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> {