use crate::runtime::Task;
use crate::utils::never_wait_lock::NeverWaitLock;
use crate::utils::SpinLockGuard;
use std::collections::VecDeque;
pub(crate) struct ExecutorSharedTaskList {
executor_id: usize,
list: NeverWaitLock<Vec<Task>>,
}
impl ExecutorSharedTaskList {
pub(crate) const fn new(executor_id: usize) -> Self {
Self {
executor_id,
list: NeverWaitLock::new(Vec::new()),
}
}
#[inline(always)]
pub(crate) fn executor_id(&self) -> usize {
self.executor_id
}
pub(crate) fn try_lock_and_return_as_vec(&self) -> Option<SpinLockGuard<Vec<Task>>> {
self.list.try_lock()
}
#[inline(always)]
pub(crate) fn take_batch(&self, other_list: &mut VecDeque<Task>, limit: usize) {
if let Some(mut guard) = self.list.try_lock() {
let number_of_elems = guard.len().min(limit);
for _ in 0..number_of_elems {
other_list.push_back(unsafe { guard.pop().unwrap_unchecked() });
}
}
}
}
unsafe impl Send for ExecutorSharedTaskList {}
unsafe impl Sync for ExecutorSharedTaskList {}