use crate::sched::{IntoSchedParams, ParameterizedScheduler, Scheduler};
use std::thread;
#[must_use = "must eventually spawn the thread"]
#[derive(Debug)]
pub struct Builder {
name: Option<String>,
stack_size: Option<usize>,
parameterized_scheduler: ParameterizedScheduler,
}
impl Builder {
pub fn new(scheduler: Scheduler, params: impl IntoSchedParams) -> Builder {
Builder {
name: None,
stack_size: None,
parameterized_scheduler: scheduler.with_params(params.into_sched_params()),
}
}
pub fn name(mut self, name: &str) -> Builder {
self.name = Some(name.into());
self
}
pub fn stack_size(mut self, stack_size: usize) -> Builder {
self.stack_size = Some(stack_size);
self
}
pub fn try_spawn<F, T>(self, f: F) -> thread::JoinHandle<T>
where
F: FnOnce(crate::sched::RtResult<()>) -> T + Send + 'static,
T: Send + 'static,
{
let mut tb = thread::Builder::new();
if let Some(name) = self.name {
tb = tb.name(name.clone());
}
if let Some(stack_size) = self.stack_size {
tb = tb.stack_size(stack_size);
}
tb.spawn(|| {
let sched_result = self.parameterized_scheduler.set_current();
f(sched_result)
})
.expect("failed to spawn thread")
}
}
pub fn spawn<F, T>(
scheduler: Scheduler,
params: impl IntoSchedParams,
f: F,
) -> thread::JoinHandle<T>
where
F: FnOnce() -> T,
F: Send + 'static,
T: Send + 'static,
{
try_spawn(scheduler, params, move |set_result| {
set_result.expect("failed to set scheduler");
f()
})
}
pub fn try_spawn<F, T>(
scheduler: Scheduler,
params: impl IntoSchedParams,
f: F,
) -> thread::JoinHandle<T>
where
F: FnOnce(crate::sched::RtResult<()>) -> T,
F: Send + 'static,
T: Send + 'static,
{
Builder::new(scheduler, params).try_spawn(f)
}