use std::sync::LazyLock;
use crossbeam_channel::{bounded, Sender};
const POOL_SIZE: usize = 4;
const QUEUE_CAPACITY: usize = 1024;
static POOL: LazyLock<Sender<Box<dyn FnOnce() + Send + 'static>>> = LazyLock::new(|| {
let (tx, rx) = bounded::<Box<dyn FnOnce() + Send + 'static>>(QUEUE_CAPACITY);
for i in 0..POOL_SIZE {
let rx = rx.clone();
std::thread::Builder::new()
.name(format!("xphone-cb-{}", i))
.spawn(move || {
while let Ok(task) = rx.recv() {
task();
}
})
.expect("failed to spawn callback pool thread");
}
tx
});
pub fn spawn_callback(f: impl FnOnce() + Send + 'static) {
let boxed: Box<dyn FnOnce() + Send + 'static> = Box::new(f);
match POOL.try_send(boxed) {
Err(crossbeam_channel::TrySendError::Full(task))
| Err(crossbeam_channel::TrySendError::Disconnected(task)) => {
std::thread::spawn(task);
}
_ => {}
}
}