soph_runtime/support/
runtime.rsuse crate::{config, Runtime, RuntimeResult};
use soph_config::support::config;
impl Runtime {
pub fn new() -> RuntimeResult<Self> {
let config = config().parse::<config::Runtime>()?;
let mut builder = match config.kind {
config::Kind::CurrentThread => tokio::runtime::Builder::new_current_thread(),
config::Kind::MultiThread => tokio::runtime::Builder::new_multi_thread(),
config::Kind::MultiThreadAlt => tokio::runtime::Builder::new_multi_thread_alt(),
};
if let Some(num) = config.worker_threads {
builder.worker_threads(num);
}
if let Some(stack_size) = config.thread_stack_size {
builder.thread_stack_size(stack_size);
}
if let Some(time) = config.keep_alive {
builder.thread_keep_alive(std::time::Duration::from_millis(time));
}
if let Some(queue_interval) = config.global_queue_interval {
builder.global_queue_interval(queue_interval);
}
let behavior = match config.unhandled_panic {
config::UnhandledPanic::Ignore => tokio::runtime::UnhandledPanic::Ignore,
config::UnhandledPanic::ShutdownRuntime => tokio::runtime::UnhandledPanic::Ignore,
};
if config.enable_metrics_poll_time_histogram {
builder.enable_metrics_poll_time_histogram();
}
if config.disable_lifo_slot {
builder.disable_lifo_slot();
}
let runtime = builder
.enable_all()
.max_io_events_per_tick(config.nevents)
.max_blocking_threads(config.max_blocking_threads)
.thread_name(config.thread_name.to_string())
.event_interval(config.event_interval)
.unhandled_panic(behavior)
.build()?;
Ok(Self { inner: runtime })
}
}
impl std::ops::Deref for Runtime {
type Target = tokio::runtime::Runtime;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl Default for Runtime {
fn default() -> Self {
Self {
inner: tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.expect("Failed to initialize runtime"),
}
}
}