use super::{
config::{CleanupConfig, ExecutorConfig, MemoryConfig, PreemptionConfig},
placement::WorkerPlacement,
};
use crate::platform::String;
pub struct ExecutorBuilder {
pub(crate) config: ExecutorConfig,
}
impl ExecutorBuilder {
#[must_use]
pub fn new() -> Self {
Self {
config: ExecutorConfig::default(),
}
}
#[must_use]
pub fn worker_threads(mut self, count: usize) -> Self {
self.config.worker_threads = count;
self
}
#[must_use]
pub fn worker_placement(mut self, placement: WorkerPlacement) -> Self {
self.config.worker_placement = placement;
self
}
#[must_use]
pub fn async_threads(mut self, count: usize) -> Self {
self.config.async_threads = count;
self
}
#[must_use]
pub fn max_global_queue_size(mut self, size: usize) -> Self {
self.config.max_global_queue_size = size;
self
}
#[must_use]
pub fn local_queue_initial_capacity(mut self, size: usize) -> Self {
self.config.local_queue_initial_capacity = size;
self
}
#[must_use]
pub fn thread_name_prefix(mut self, prefix: impl Into<String>) -> Self {
self.config.thread_name_prefix = prefix.into();
self
}
#[cfg(feature = "metrics")]
#[must_use]
pub fn enable_metrics(mut self, enabled: bool) -> Self {
self.config.enable_metrics = enabled;
self
}
#[must_use]
pub fn preemption_config(mut self, config: PreemptionConfig) -> Self {
self.config.preemption = config;
self
}
#[must_use]
pub fn memory_config(mut self, config: MemoryConfig) -> Self {
self.config.memory = config;
self
}
#[must_use]
pub fn cleanup_config(mut self, config: CleanupConfig) -> Self {
self.config.cleanup = config;
self
}
}
impl Default for ExecutorBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::{ExecutorBuilder, WorkerPlacement};
#[test]
fn local_queue_initial_capacity_updates_the_configuration() {
let builder = ExecutorBuilder::new().local_queue_initial_capacity(17);
assert_eq!(builder.config.local_queue_initial_capacity, 17);
}
#[test]
fn worker_placement_defaults_to_unbound_and_is_settable() {
assert_eq!(
ExecutorBuilder::new().config.worker_placement,
WorkerPlacement::Unbound
);
assert_eq!(
ExecutorBuilder::new()
.worker_placement(WorkerPlacement::Pinned)
.config
.worker_placement,
WorkerPlacement::Pinned
);
}
}