use crate::runtime::Task;
use crate::utils::SpinLock;
use std::collections::VecDeque;
pub struct SyncTaskList {
inner: SpinLock<Vec<Task>>,
}
impl SyncTaskList {
pub const fn new() -> Self {
Self {
inner: SpinLock::new(Vec::new()),
}
}
pub unsafe fn push(&self, task: Task) {
self.inner.lock().push(task);
}
#[inline(always)]
pub fn pop(&self) -> Option<Task> {
self.inner.lock().pop()
}
#[inline(always)]
pub fn pop_all_in(&self, tasks: &mut Vec<Task>) {
let mut guard = self.inner.lock();
tasks.append(&mut guard);
}
#[inline(always)]
pub(crate) fn take_batch(&self, other_list: &mut VecDeque<Task>, limit: usize) {
let mut guard = self.inner.lock();
let number_of_elems = guard.len().min(limit);
for elem in guard.drain(..number_of_elems) {
other_list.push_back(elem);
}
}
}
impl Default for SyncTaskList {
fn default() -> Self {
Self::new()
}
}
unsafe impl Send for SyncTaskList {}
unsafe impl Sync for SyncTaskList {}