Skip to main content

pagers_core/
events.rs

1//! Events emitted during file processing for UI consumption.
2
3use std::sync::Arc;
4use std::sync::Mutex;
5use std::sync::mpsc::Sender;
6
7use crate::mincore::DefaultPageMap;
8
9#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum Event<PM = DefaultPageMap> {
12    /// A file has started processing. Includes initial residency snapshot.
13    FileStart {
14        path: Arc<str>,
15        total_pages: usize,
16        residency: PM,
17    },
18    /// Residency update during touch/lock polling.
19    FileProgress {
20        path: Arc<str>,
21        page_offset: usize,
22        pages_walked: usize,
23        resident: bool,
24    },
25    /// File processing complete.
26    FileDone {
27        path: Arc<str>,
28    },
29    AllDone,
30}
31
32/// `Sync` wrapper around `Sender<Event>` for use with rayon.
33pub struct EventSink<PM>(Mutex<Sender<Event<PM>>>);
34
35impl<PM> EventSink<PM> {
36    pub fn new(sender: Sender<Event<PM>>) -> Self {
37        Self(Mutex::new(sender))
38    }
39
40    pub fn send(&self, event: Event<PM>) {
41        let _ = self.0.lock().unwrap().send(event);
42    }
43}