diff --git a/src/runtime2/mod.rs b/src/runtime2/mod.rs index 8ac3156cbb45147d161cbe4457f58ea181a64fe1..e199ab5e454d13ea8067111623dfb14e30526cf1 100644 --- a/src/runtime2/mod.rs +++ b/src/runtime2/mod.rs @@ -17,13 +17,10 @@ use std::sync::{Arc, Mutex}; use std::sync::atomic::Ordering; use std::thread::{self, JoinHandle}; -use crate::protocol::eval::*; -use crate::{common::Id, PortId, ProtocolDescription}; +use crate::ProtocolDescription; use global_store::{ConnectorVariant, GlobalStore}; use scheduler::Scheduler; -use crate::protocol::ComponentCreationError; -use connector::{Branch, ConnectorPDL, find_ports_in_value_group}; use native::{ConnectorApplication, ApplicationInterface}; @@ -42,6 +39,10 @@ pub(crate) struct RuntimeInner { schedulers: Mutex>>, // TODO: Revise, make exit condition something like: all interfaces dropped } +// TODO: Come back to this at some point +unsafe impl Send for RuntimeInner {} +unsafe impl Sync for RuntimeInner {} + impl Runtime { pub fn new(num_threads: usize, protocol_description: ProtocolDescription) -> Runtime { // Setup global state @@ -56,8 +57,9 @@ impl Runtime { { let mut schedulers = Vec::with_capacity(num_threads); for _ in 0..num_threads { - let mut scheduler = Scheduler::new(runtime_inner.clone()); + let cloned_runtime_inner = runtime_inner.clone(); let thread = thread::spawn(move || { + let mut scheduler = Scheduler::new(cloned_runtime_inner); scheduler.run(); }); @@ -76,9 +78,7 @@ impl Runtime { /// created. pub fn create_interface(&self) -> ApplicationInterface { let (connector, mut interface) = ConnectorApplication::new(self.inner.clone()); - let connector = Box::new(connector); - - let connector_key = self.global_store.connectors.create(ConnectorVariant::Native(connector)); + let connector_key = self.inner.global_store.connectors.create_interface(connector); interface.set_connector_id(connector_key.downcast()); // Note that we're not scheduling. That is done by the interface in case