erebus-sdk-rust 1.4.0

Erebus SDK for Rust
Documentation
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();

            // sleep for 1ms
            std::thread::sleep(std::time::Duration::from_millis(100));
        }
    }
}