use std::{
sync::{
Arc, Mutex,
atomic::{AtomicBool, Ordering},
},
thread::JoinHandle,
};
use crate::{body::BodySenders, driver::observer::Observer};
#[cfg(target_os = "macos")]
use crate::driver::observer::OSXObserver;
mod observer;
#[derive(Debug)]
pub(crate) struct Driver {
stop: Arc<AtomicBool>,
handle: Option<JoinHandle<()>>,
}
impl Driver {
pub(crate) fn new(body_senders: Arc<Mutex<BodySenders>>) -> Self {
let stop = Arc::new(AtomicBool::new(false));
#[cfg(target_os = "macos")]
let stop_cl = stop.clone();
let handle = std::thread::spawn(move || {
#[cfg(target_os = "macos")]
let observer = OSXObserver::new(stop_cl);
observer.observe(body_senders);
});
Driver {
stop,
handle: Some(handle),
}
}
}
impl Drop for Driver {
fn drop(&mut self) {
self.stop.store(true, Ordering::Relaxed);
if let Some(handle) = self.handle.take() {
handle.join().unwrap();
}
}
}