1use 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 FileStart {
14 path: Arc<str>,
15 total_pages: usize,
16 residency: PM,
17 },
18 FileProgress {
20 path: Arc<str>,
21 page_offset: usize,
22 pages_walked: usize,
23 resident: bool,
24 },
25 FileDone {
27 path: Arc<str>,
28 },
29 AllDone,
30}
31
32pub 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}