mod builder;
mod config;
mod counter;
mod gate;
mod queue;
mod shared;
mod task;
pub mod set_config {
pub use super::config::{reset_defaults, set_num_threads_default, set_num_threads_default_all};
#[cfg(feature = "local-batch")]
pub use super::config::{set_batch_limit_default, set_weight_limit_default};
#[cfg(feature = "retry")]
pub use super::config::{
set_max_retries_default, set_retries_default_disabled, set_retry_factor_default,
};
}
pub use self::builder::{Builder, BuilderConfig};
pub use self::queue::{ChannelTaskQueues, TaskQueues, WorkerQueues, WorkstealingTaskQueues};
pub use self::task::TaskInput;
use self::counter::DualCounter;
use self::gate::{Gate, PhasedGate};
use self::queue::PopTaskError;
use crate::atomic::{AtomicAny, AtomicBool, AtomicOption, AtomicUsize};
use crate::bee::{Queen, TaskMeta, Worker};
use crate::hive::{OutcomeQueue, OutcomeSender, SpawnError};
use parking_lot::Mutex;
use std::thread::JoinHandle;
type Any<T> = AtomicOption<T, AtomicAny<T>>;
type Usize = AtomicOption<usize, AtomicUsize>;
#[cfg(feature = "retry")]
type U8 = AtomicOption<u8, crate::atomic::AtomicU8>;
#[cfg(any(feature = "local-batch", feature = "retry"))]
type U64 = AtomicOption<u64, crate::atomic::AtomicU64>;
pub struct Token;
#[derive(Debug)]
pub struct Task<W: Worker> {
input: W::Input,
meta: TaskMeta,
outcome_tx: Option<OutcomeSender<W>>,
}
pub struct Shared<Q: Queen, T: TaskQueues<Q::Kind>> {
config: Config,
queen: Q,
task_queues: T,
spawn_results: Mutex<Vec<Result<JoinHandle<()>, SpawnError>>>,
num_tasks: DualCounter<48>,
next_task_id: AtomicUsize,
num_panics: AtomicUsize,
num_referrers: AtomicUsize,
poisoned: AtomicBool,
suspended: AtomicBool,
resume_gate: Gate,
join_gate: PhasedGate,
outcomes: OutcomeQueue<Q::Kind>,
}
#[derive(Clone, Debug)]
pub struct Config {
num_threads: Usize,
thread_name: Any<String>,
thread_stack_size: Usize,
#[cfg(feature = "affinity")]
affinity: Any<crate::hive::cores::Cores>,
#[cfg(feature = "local-batch")]
batch_limit: Usize,
#[cfg(feature = "local-batch")]
weight_limit: U64,
#[cfg(feature = "retry")]
max_retries: U8,
#[cfg(feature = "retry")]
retry_factor: U64,
}
#[cfg(test)]
pub(super) mod builder_test_utils {
use super::*;
pub fn check_builder<B: Builder>(builder: &mut B) {
let config = builder.config_ref(Token);
assert_eq!(config.num_threads.get(), Some(4));
assert_eq!(config.thread_name.get(), Some("foo".into()));
assert_eq!(config.thread_stack_size.get(), Some(100));
}
}