diff --git a/src/runtime/mod.rs b/src/runtime/mod.rs index 4dfb9af6d3a5b20a47842fefa838eac1b1f8679d..e83c3598d94397628c62c52f4bade45a3ee44ee1 100644 --- a/src/runtime/mod.rs +++ b/src/runtime/mod.rs @@ -29,7 +29,7 @@ pub struct VecLogger(ConnectorId, Vec); pub struct DummyLogger; #[derive(Debug)] pub struct FileLogger(ConnectorId, std::fs::File); -#[derive(Debug)] +#[derive(Debug, Clone)] struct CurrentState { port_info: HashMap, id_manager: IdManager, @@ -40,9 +40,10 @@ pub(crate) struct NonsyncProtoContext<'a> { proto_component_id: ComponentId, // KEY in id->component map } pub(crate) struct SyncProtoContext<'a> { - cu_inner: &'a mut ConnectorUnphasedInner, // persists between rounds + rctx: &'a RoundCtx, + // cu: &'a mut dyn CuUndecided, branch_inner: &'a mut ProtoComponentBranchInner, // sub-structure of component branch - predicate: &'a Predicate, // KEY in pred->branch map + predicate: &'a Predicate, // KEY in pred->branch map } #[derive(Default, Debug, Clone)] struct ProtoComponentBranchInner { @@ -175,7 +176,7 @@ struct Neighborhood { parent: Option, children: VecSet, } -#[derive(Debug)] +#[derive(Debug, Clone)] struct IdManager { connector_id: ConnectorId, port_suffix_stream: U32Stream, @@ -249,6 +250,26 @@ enum ConnectorPhased { struct Predicate { assigned: BTreeMap, } +#[derive(Debug)] +struct SolutionStorage { + old_local: HashSet, + new_local: HashSet, + // this pair acts as SubtreeId -> HashSet which is friendlier to iteration + subtree_solutions: Vec>, + subtree_id_to_index: HashMap, +} +struct RoundCtx { + solution_storage: SolutionStorage, + spec_var_stream: SpecVarStream, + payload_inbox: Vec<(PortId, SendPayloadMsg)>, + deadline: Option, + current_state: CurrentState, +} +trait CuUndecided { + fn logger(&mut self) -> &mut dyn Logger; + fn proto_description(&self) -> &ProtocolDescription; + fn native_component_id(&self) -> ComponentId; +} #[derive(Debug, Default)] struct NativeBatch { // invariant: putters' and getters' polarities respected @@ -261,10 +282,6 @@ enum TokenTarget { UdpEndpoint { index: usize }, Waker, } -trait RoundCtxTrait { - fn get_deadline(&self) -> &Option; - fn getter_add(&mut self, getter: PortId, msg: SendPayloadMsg); -} enum CommRecvOk { TimeoutWithoutNew, NewPayloadMsgs, @@ -653,3 +670,21 @@ impl Debug for UdpInBuffer { write!(f, "UdpInBuffer") } } + +impl RoundCtx { + fn getter_pop(&mut self) -> Option<(PortId, SendPayloadMsg)> { + self.payload_inbox.pop() + } + fn getter_push(&mut self, getter: PortId, msg: SendPayloadMsg) { + self.payload_inbox.push((getter, msg)); + } + fn putter_push(&mut self, cu: &mut impl CuUndecided, putter: PortId, msg: SendPayloadMsg) { + if let Some(getter) = self.current_state.port_info.get(&putter).unwrap().peer { + log!(cu.logger(), "Putter add (putter:{:?} => getter:{:?})", putter, getter); + self.getter_push(getter, msg); + } else { + log!(cu.logger(), "Putter {:?} has no known peer!", putter); + panic!("Putter {:?} has no known peer!"); + } + } +}