diff --git a/src/core/eventloop.rs b/src/core/eventloop.rs index 6c80267..3d27133 100644 --- a/src/core/eventloop.rs +++ b/src/core/eventloop.rs @@ -10,10 +10,15 @@ use std::rc::Rc; use std::sync::{Arc, RwLock}; use std::thread::{self, JoinHandle}; +use super::registry::Registry; +use crate::nodes::data::PulseSender; + pub struct EventLoop { pub socket_path: String, join_handle: RwLock>>>, stop_write: pipe::Sender, + + pub pulse_senders: Registry>, } impl EventLoop { @@ -26,6 +31,8 @@ impl EventLoop { socket_path, join_handle: RwLock::new(None), stop_write: sender, + + pulse_senders: Default::default(), }); let event_loop_arc_captured = event_loop_arc.clone(); let join_handle = thread::Builder::new() diff --git a/src/nodes/data.rs b/src/nodes/data.rs new file mode 100644 index 0000000..ba04fcc --- /dev/null +++ b/src/nodes/data.rs @@ -0,0 +1,46 @@ +use super::core::Node; +use crate::core::eventloop::EventLoop; +use anyhow::{ensure, Result}; +use rccell::RcCell; +use std::sync::{Arc, RwLock, Weak}; + +pub struct PulseSender { + event_loop: Weak, + registry_idx: RwLock>, +} + +impl PulseSender { + pub fn add_to(node: &RcCell) -> Result<()> { + ensure!( + node.borrow().spatial.is_some(), + "Node does not have a spatial attached!" + ); + + let sender = Arc::new(PulseSender { + event_loop: node.borrow().get_client().map_or(Weak::new(), |client| { + Arc::downgrade(&client.get_event_loop()) + }), + registry_idx: RwLock::new(None), + }); + let idx = sender + .event_loop + .upgrade() + .and_then(|event_loop| event_loop.pulse_senders.add(sender.clone()).ok()); + *sender.registry_idx.write().unwrap() = idx; + Ok(()) + } +} + +impl Drop for PulseSender { + fn drop(&mut self) { + let event_loop = self.event_loop.upgrade(); + let idx = self + .registry_idx + .write() + .ok() + .and_then(|registry_idx| registry_idx.clone()); + event_loop + .zip(idx) + .and_then(|(event_loop, idx)| event_loop.pulse_senders.remove(idx).ok()); + } +} diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs index dd6a454..5ba455b 100644 --- a/src/nodes/mod.rs +++ b/src/nodes/mod.rs @@ -1,3 +1,4 @@ pub mod core; +pub mod data; pub mod field; pub mod spatial;