diff --git a/src/runtime2/component/component_context.rs b/src/runtime2/component/component_context.rs index 84c5594683bb234fe23c173307648b1b895590cc..4b6f03e7f95c03b7fb010afc0513bcd4f78aa3cb 100644 --- a/src/runtime2/component/component_context.rs +++ b/src/runtime2/component/component_context.rs @@ -95,10 +95,11 @@ impl CompCtx { /// then it will be used to add the peer. Otherwise it will be retrieved /// from the runtime using its ID. pub(crate) fn add_peer(&mut self, port_handle: LocalPortHandle, sched_ctx: &SchedulerCtx, peer_comp_id: CompId, handle: Option<&CompHandle>) { + let self_id = self.id; let port = self.get_port_mut(port_handle); debug_assert_eq!(port.peer_comp_id, peer_comp_id); debug_assert!(!port.associated_with_peer); - if !self.requires_peer_reference(port) { + if !Self::requires_peer_reference(port, self_id) { return; } @@ -124,9 +125,10 @@ impl CompCtx { /// Removes a peer associated with a port. pub(crate) fn remove_peer(&mut self, sched_ctx: &SchedulerCtx, port_handle: LocalPortHandle, peer_id: CompId) { + let self_id = self.id; let port = self.get_port_mut(port_handle); debug_assert_eq!(port.peer_comp_id, peer_id); - if !self.requires_peer_reference(port) { + if !Self::requires_peer_reference(port, self_id) { return; } @@ -135,6 +137,7 @@ impl CompCtx { let peer_index = self.get_peer_index_by_id(peer_id).unwrap(); let peer = &mut self.peers[peer_index]; peer.num_associated_ports -= 1; + println!(" ****** DEBUG: Removed peer {:?} from {:?}, now at {}", peer.id, self_id, peer.num_associated_ports); if peer.num_associated_ports == 0 { let mut peer = self.peers.remove(peer_index); if let Some(key) = peer.handle.decrement_users() { @@ -173,6 +176,10 @@ impl CompCtx { return &mut self.ports[index]; } + pub(crate) fn get_port_by_index_mut(&mut self, index: usize) -> &mut Port { + return &mut self.ports[index]; + } + pub(crate) fn get_peer(&self, peer_handle: LocalPeerHandle) -> &Peer { let index = self.must_get_peer_index(peer_handle); return &self.peers[index]; @@ -188,6 +195,11 @@ impl CompCtx { return self.ports.iter(); } + #[inline] + pub(crate) fn iter_ports_mut(&mut self) -> impl Iterator { + return self.ports.iter_mut(); + } + #[inline] pub(crate) fn iter_peers(&self) -> impl Iterator { return self.peers.iter(); @@ -203,8 +215,8 @@ impl CompCtx { // ------------------------------------------------------------------------- #[inline] - fn requires_peer_reference(&self, port: &Port) -> bool { - return port.state == PortState::Closed; + fn requires_peer_reference(port: &Port, self_id: CompId) -> bool { + return port.state != PortState::Closed && port.peer_comp_id != self_id; } fn must_get_port_index(&self, handle: LocalPortHandle) -> usize {