use tokio::sync::Mutex;
pub struct Pool<T> {
instances: Box<[Mutex<T>]>,
}
impl<T> Pool<T> {
pub fn new(size: usize, initializer: impl Fn() -> T) -> Self {
Pool {
instances: (0..size)
.map(|_| Mutex::new(initializer()))
.collect::<Box<[_]>>(),
}
}
#[inline(always)]
pub fn get_instance(&self) -> &Mutex<T> {
let len = self.instances.len();
let mut start_index = 0usize;
loop {
for i in 0..len {
let index = (start_index + i) % len;
if let Ok(guard) = self.instances[index].try_lock() {
drop(guard);
return &self.instances[index];
}
}
start_index = (start_index + 1) % len;
std::hint::spin_loop();
std::thread::sleep(std::time::Duration::from_millis(100));
}
}
}