1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use super::DropMsg;
use ringbuf::Consumer;
pub(crate) struct DropThread {
terminate: std::sync::Arc<std::sync::atomic::AtomicBool>,
th: Option<std::thread::JoinHandle<()>>,
}
impl DropThread {
pub(crate) fn new(mut graph_drop_con: Consumer<DropMsg>) -> Self {
let terminate = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false));
let th_terminate = terminate.clone();
let th = std::thread::spawn(move || {
loop {
if th_terminate.load(std::sync::atomic::Ordering::Relaxed) {
return;
}
while let Some(_node) = graph_drop_con.pop() {
}
std::thread::sleep(std::time::Duration::from_millis(250));
}
});
Self { th: Some(th), terminate }
}
}
impl Drop for DropThread {
fn drop(&mut self) {
self.terminate.store(true, std::sync::atomic::Ordering::Relaxed);
let _ = self.th.take().unwrap().join();
}
}