mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
rt: allow configuring I/O events capacity (#5186)
Adds a method `Builder::max_io_events_per_tick()` to the runtime builder. This can be used to configure the capacity of events that may be processed per OS poll.
This commit is contained in:
parent
22cff80048
commit
36039d0bb9
@ -294,7 +294,7 @@ pub(crate) mod test {
|
|||||||
#[cfg_attr(miri, ignore)] // Miri does not support epoll.
|
#[cfg_attr(miri, ignore)] // Miri does not support epoll.
|
||||||
#[test]
|
#[test]
|
||||||
fn does_not_register_signal_if_queue_empty() {
|
fn does_not_register_signal_if_queue_empty() {
|
||||||
let (io_driver, io_handle) = IoDriver::new().unwrap();
|
let (io_driver, io_handle) = IoDriver::new(1024).unwrap();
|
||||||
let signal_driver = SignalDriver::new(io_driver, &io_handle).unwrap();
|
let signal_driver = SignalDriver::new(io_driver, &io_handle).unwrap();
|
||||||
let handle = signal_driver.handle();
|
let handle = signal_driver.handle();
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ pub struct Builder {
|
|||||||
|
|
||||||
/// Whether or not to enable the I/O driver
|
/// Whether or not to enable the I/O driver
|
||||||
enable_io: bool,
|
enable_io: bool,
|
||||||
|
nevents: usize,
|
||||||
|
|
||||||
/// Whether or not to enable the time driver
|
/// Whether or not to enable the time driver
|
||||||
enable_time: bool,
|
enable_time: bool,
|
||||||
@ -228,6 +229,7 @@ impl Builder {
|
|||||||
|
|
||||||
// I/O defaults to "off"
|
// I/O defaults to "off"
|
||||||
enable_io: false,
|
enable_io: false,
|
||||||
|
nevents: 1024,
|
||||||
|
|
||||||
// Time defaults to "off"
|
// Time defaults to "off"
|
||||||
enable_time: false,
|
enable_time: false,
|
||||||
@ -647,6 +649,7 @@ impl Builder {
|
|||||||
enable_io: self.enable_io,
|
enable_io: self.enable_io,
|
||||||
enable_time: self.enable_time,
|
enable_time: self.enable_time,
|
||||||
start_paused: self.start_paused,
|
start_paused: self.start_paused,
|
||||||
|
nevents: self.nevents,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -938,6 +941,25 @@ cfg_io_driver! {
|
|||||||
self.enable_io = true;
|
self.enable_io = true;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Enables the I/O driver and configures the max number of events to be
|
||||||
|
/// processed per tick.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use tokio::runtime;
|
||||||
|
///
|
||||||
|
/// let rt = runtime::Builder::new_current_thread()
|
||||||
|
/// .enable_io()
|
||||||
|
/// .max_io_events_per_tick(1024)
|
||||||
|
/// .build()
|
||||||
|
/// .unwrap();
|
||||||
|
/// ```
|
||||||
|
pub fn max_io_events_per_tick(&mut self, capacity: usize) -> &mut Self {
|
||||||
|
self.nevents = capacity;
|
||||||
|
self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,11 +36,12 @@ pub(crate) struct Cfg {
|
|||||||
pub(crate) enable_time: bool,
|
pub(crate) enable_time: bool,
|
||||||
pub(crate) enable_pause_time: bool,
|
pub(crate) enable_pause_time: bool,
|
||||||
pub(crate) start_paused: bool,
|
pub(crate) start_paused: bool,
|
||||||
|
pub(crate) nevents: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Driver {
|
impl Driver {
|
||||||
pub(crate) fn new(cfg: Cfg) -> io::Result<(Self, Handle)> {
|
pub(crate) fn new(cfg: Cfg) -> io::Result<(Self, Handle)> {
|
||||||
let (io_stack, io_handle, signal_handle) = create_io_stack(cfg.enable_io)?;
|
let (io_stack, io_handle, signal_handle) = create_io_stack(cfg.enable_io, cfg.nevents)?;
|
||||||
|
|
||||||
let clock = create_clock(cfg.enable_pause_time, cfg.start_paused);
|
let clock = create_clock(cfg.enable_pause_time, cfg.start_paused);
|
||||||
|
|
||||||
@ -135,12 +136,12 @@ cfg_io_driver! {
|
|||||||
Disabled(UnparkThread),
|
Disabled(UnparkThread),
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_io_stack(enabled: bool) -> io::Result<(IoStack, IoHandle, SignalHandle)> {
|
fn create_io_stack(enabled: bool, nevents: usize) -> io::Result<(IoStack, IoHandle, SignalHandle)> {
|
||||||
#[cfg(loom)]
|
#[cfg(loom)]
|
||||||
assert!(!enabled);
|
assert!(!enabled);
|
||||||
|
|
||||||
let ret = if enabled {
|
let ret = if enabled {
|
||||||
let (io_driver, io_handle) = crate::runtime::io::Driver::new()?;
|
let (io_driver, io_handle) = crate::runtime::io::Driver::new(nevents)?;
|
||||||
|
|
||||||
let (signal_driver, signal_handle) = create_signal_driver(io_driver, &io_handle)?;
|
let (signal_driver, signal_handle) = create_signal_driver(io_driver, &io_handle)?;
|
||||||
let process_driver = create_process_driver(signal_driver);
|
let process_driver = create_process_driver(signal_driver);
|
||||||
@ -201,7 +202,7 @@ cfg_not_io_driver! {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub(crate) struct IoStack(ParkThread);
|
pub(crate) struct IoStack(ParkThread);
|
||||||
|
|
||||||
fn create_io_stack(_enabled: bool) -> io::Result<(IoStack, IoHandle, SignalHandle)> {
|
fn create_io_stack(_enabled: bool, _nevents: usize) -> io::Result<(IoStack, IoHandle, SignalHandle)> {
|
||||||
let park_thread = ParkThread::new();
|
let park_thread = ParkThread::new();
|
||||||
let unpark_thread = park_thread.unpark();
|
let unpark_thread = park_thread.unpark();
|
||||||
Ok((IoStack(park_thread), unpark_thread, Default::default()))
|
Ok((IoStack(park_thread), unpark_thread, Default::default()))
|
||||||
|
@ -104,7 +104,7 @@ fn _assert_kinds() {
|
|||||||
impl Driver {
|
impl Driver {
|
||||||
/// Creates a new event loop, returning any error that happened during the
|
/// Creates a new event loop, returning any error that happened during the
|
||||||
/// creation.
|
/// creation.
|
||||||
pub(crate) fn new() -> io::Result<(Driver, Handle)> {
|
pub(crate) fn new(nevents: usize) -> io::Result<(Driver, Handle)> {
|
||||||
let poll = mio::Poll::new()?;
|
let poll = mio::Poll::new()?;
|
||||||
#[cfg(not(tokio_wasi))]
|
#[cfg(not(tokio_wasi))]
|
||||||
let waker = mio::Waker::new(poll.registry(), TOKEN_WAKEUP)?;
|
let waker = mio::Waker::new(poll.registry(), TOKEN_WAKEUP)?;
|
||||||
@ -116,7 +116,7 @@ impl Driver {
|
|||||||
let driver = Driver {
|
let driver = Driver {
|
||||||
tick: 0,
|
tick: 0,
|
||||||
signal_ready: false,
|
signal_ready: false,
|
||||||
events: mio::Events::with_capacity(1024),
|
events: mio::Events::with_capacity(nevents),
|
||||||
poll,
|
poll,
|
||||||
resources: slab,
|
resources: slab,
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user