use alloc::sync::Arc;
use core::array;
use core::task::Waker;
use std::sync::{Mutex, MutexGuard};
use super::{InlineWakerArray, ReadinessArray};
pub(crate) struct WakerArray<const N: usize> {
wakers: [Waker; N],
readiness: Arc<Mutex<ReadinessArray<N>>>,
}
impl<const N: usize> WakerArray<N> {
pub(crate) fn new() -> Self {
let readiness = Arc::new(Mutex::new(ReadinessArray::new()));
Self {
wakers: array::from_fn(|i| {
Arc::new(InlineWakerArray::new(i, readiness.clone())).into()
}),
readiness,
}
}
pub(crate) fn get(&self, index: usize) -> Option<&Waker> {
self.wakers.get(index)
}
pub(crate) fn readiness(&mut self) -> MutexGuard<'_, ReadinessArray<N>> {
self.readiness.as_ref().lock().unwrap()
}
}