use std::collections::HashSet;
use std::sync::Arc;
use tokio::sync::{Notify, RwLock};
#[derive(Clone)]
pub struct TaskExecutor {
running_tasks: Arc<RwLock<HashSet<String>>>,
shutdown_signal: Arc<Notify>,
}
impl TaskExecutor {
pub fn new() -> Self {
Self {
running_tasks: Arc::new(RwLock::new(HashSet::new())),
shutdown_signal: Arc::new(Notify::new()),
}
}
pub async fn add_running_task(&self, task_id: String) {
let mut running = self.running_tasks.write().await;
running.insert(task_id);
}
pub async fn remove_running_task(&self, task_id: &str) {
let mut running = self.running_tasks.write().await;
running.remove(task_id);
}
pub async fn running_count(&self) -> usize {
let running = self.running_tasks.read().await;
running.len()
}
pub async fn is_empty(&self) -> bool {
let running = self.running_tasks.read().await;
running.is_empty()
}
pub fn shutdown(&self) {
self.shutdown_signal.notify_waiters();
}
pub fn wait_for_shutdown(&self) -> &Notify {
&self.shutdown_signal
}
pub async fn wait_for_running_tasks(&self) {
while !self.is_empty().await {
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
}
}
}