diff --git a/src/runtime2/communication.rs b/src/runtime2/communication.rs index 4fee962a9b41daa870d84b2b60e71585d5b630a3..c4bee587535d12a0410fcc24ff6545f853431c3c 100644 --- a/src/runtime2/communication.rs +++ b/src/runtime2/communication.rs @@ -1,10 +1,14 @@ use crate::protocol::eval::*; use super::runtime::*; +use super::component::*; #[derive(Copy, Clone)] pub struct PortId(pub u32); + impl PortId { + /// This value is not significant, it is chosen to make debugging easier: a + /// very large port number is more likely to shine a light on bugs. pub fn new_invalid() -> Self { return Self(u32::MAX); } @@ -16,11 +20,13 @@ pub struct Peer { pub(crate) handle: CompHandle, } +#[derive(Debug, PartialEq, Eq)] pub enum PortKind { Putter, Getter, } +#[derive(Debug, PartialEq, Eq)] pub enum PortState { Open, Blocked, @@ -41,22 +47,36 @@ pub struct Channel { } pub struct DataMessage { - pub source_port_id: PortId, - pub target_port_id: PortId, + pub data_header: MessageDataHeader, + pub sync_header: MessageSyncHeader, pub content: ValueGroup, } +pub struct MessageSyncHeader { + pub sync_round: u32, +} + +pub struct MessageDataHeader { + pub expected_mapping: Vec<(PortId, u32)>, + pub new_mapping: u32, + pub source_port: PortId, + pub target_port: PortId, +} + pub struct ControlMessage { - pub id: u32, + pub id: ControlId, pub sender_comp_id: CompId, - pub content: ControlContent, + pub target_port_id: Option, + pub content: ControlMessageContent, } -pub enum ControlContent { +#[derive(Copy, Clone)] +pub enum ControlMessageContent { Ack, - Ping, - PortPeerChangedBlock, - PortPeerChangedUnblock, + BlockPort(PortId), + UnblockPort(PortId), + PortPeerChangedBlock(PortId), + PortPeerChangedUnblock(PortId, CompId), } pub enum Message { @@ -64,4 +84,15 @@ pub enum Message { Control(ControlMessage), } +impl Message { + pub(crate) fn target_port(&self) -> Option { + match self { + Message::Data(v) => + return Some(v.data_header.target_port), + Message::Control(v) => + return v.target_port_id, + } + } +} +