pub trait JoinHandle {
fn join(self: Box<Self>);
}
pub trait Thread {
fn spawn(&self, f: Box<dyn FnOnce() + Send>) -> Box<dyn JoinHandle>;
fn yield_now(&self);
fn pin(&self, core: usize);
}
#[derive(Clone)]
pub struct DefaultThread;
pub struct DefaultJoinHandle(std::thread::JoinHandle<()>);
impl JoinHandle for DefaultJoinHandle {
fn join(self: Box<Self>) {
let handle = self.0;
assert!(handle.join().is_ok());
}
}
impl Thread for DefaultThread {
fn spawn(&self, f: Box<dyn FnOnce() + Send>) -> Box<dyn JoinHandle> {
let handle = std::thread::spawn(f);
Box::new(DefaultJoinHandle(handle))
}
fn yield_now(&self) {
std::thread::yield_now();
}
fn pin(&self, core: usize) {
let cores = core_affinity::get_core_ids().unwrap();
core_affinity::set_for_current(cores[core % cores.len()]);
}
}