use crate::shared::{priority::Priority, runtime::RuntimeEngine};
use std::future::Future;
pub struct DiscardingSpawnGroup {
runtime: RuntimeEngine<()>,
pub is_cancelled: bool,
wait_at_drop: bool,
}
impl DiscardingSpawnGroup {
pub fn dont_wait_at_drop(&mut self) {
self.wait_at_drop = false;
}
}
impl DiscardingSpawnGroup {
pub fn new(num_of_threads: usize) -> Self {
Self {
is_cancelled: false,
runtime: RuntimeEngine::new(num_of_threads),
wait_at_drop: true,
}
}
}
impl Default for DiscardingSpawnGroup {
fn default() -> Self {
Self {
is_cancelled: false,
runtime: RuntimeEngine::default(),
wait_at_drop: true,
}
}
}
impl DiscardingSpawnGroup {
pub fn spawn_task(
&mut self,
priority: Priority,
closure: impl Future<Output = ()> + Send + 'static,
) {
self.runtime.write_task(priority, closure);
}
pub fn spawn_task_unlessed_cancelled(
&mut self,
priority: Priority,
closure: impl Future<Output = ()> + Send + 'static,
) {
if !self.is_cancelled {
self.runtime.write_task(priority, closure);
}
}
pub fn cancel_all(&mut self) {
self.runtime.cancel();
self.is_cancelled = true;
}
}
impl DiscardingSpawnGroup {
pub fn is_empty(&self) -> bool {
self.runtime.task_count() == 0
}
}
impl DiscardingSpawnGroup {
pub async fn wait_for_all(&mut self) {
self.runtime.wait_for_all_tasks();
}
pub fn wait_non_async(&mut self) {
self.runtime.wait_for_all_tasks();
}
}
impl Drop for DiscardingSpawnGroup {
fn drop(&mut self) {
if self.wait_at_drop {
self.runtime.wait_for_all_tasks();
}
self.runtime.end()
}
}