mod channel;
#[cfg(feature = "retry")]
mod retry;
mod status;
mod workstealing;
pub use self::channel::ChannelTaskQueues;
pub use self::workstealing::WorkstealingTaskQueues;
#[cfg(feature = "retry")]
use self::retry::RetryQueue;
use self::status::Status;
use super::{Config, Task, Token};
use crate::bee::Worker;
#[derive(thiserror::Error, Debug)]
pub enum PopTaskError {
#[error("Global task queue is empty")]
Empty,
#[error("Global task queue is closed")]
Closed,
}
pub trait TaskQueues<W: Worker>: Sized + Send + Sync + 'static {
type WorkerQueues: WorkerQueues<W>;
fn new(token: Token) -> Self;
fn init_for_threads(&self, start_index: usize, end_index: usize, config: &Config);
fn update_for_threads(&self, start_index: usize, end_index: usize, config: &Config);
fn try_push_global(&self, task: Task<W>) -> Result<(), Task<W>>;
fn worker_queues(&self, thread_index: usize) -> Self::WorkerQueues;
fn close(&self, urgent: bool, token: Token);
fn drain(self) -> Vec<Task<W>>;
}
pub trait WorkerQueues<W: Worker> {
fn push(&self, task: Task<W>);
fn try_pop(&self) -> Result<Task<W>, PopTaskError>;
#[cfg(feature = "retry")]
fn try_push_retry(&self, task: Task<W>) -> Result<std::time::Instant, Task<W>>;
#[cfg(test)]
fn thread_index(&self) -> usize;
}