use collections::HashSet; use parking_lot::Mutex; use project::ProjectEntryId; use smol::channel; use std::sync::{Arc, Weak}; /// The set of entries that are currently being indexed. pub struct IndexingEntrySet { entry_ids: Mutex>, tx: channel::Sender<()>, } /// When dropped, removes the entry from the set of entries that are being indexed. #[derive(Clone)] pub(crate) struct IndexingEntryHandle { entry_id: ProjectEntryId, set: Weak, } impl IndexingEntrySet { pub fn new(tx: channel::Sender<()>) -> Self { Self { entry_ids: Default::default(), tx, } } pub fn insert(self: &Arc, entry_id: ProjectEntryId) -> IndexingEntryHandle { self.entry_ids.lock().insert(entry_id); self.tx.send_blocking(()).ok(); IndexingEntryHandle { entry_id, set: Arc::downgrade(self), } } pub fn len(&self) -> usize { self.entry_ids.lock().len() } } impl Drop for IndexingEntryHandle { fn drop(&mut self) { if let Some(set) = self.set.upgrade() { set.tx.send_blocking(()).ok(); set.entry_ids.lock().remove(&self.entry_id); } } }