diff --git a/src/runtime2/component/component_context.rs b/src/runtime2/component/component_context.rs index 4b6f03e7f95c03b7fb010afc0513bcd4f78aa3cb..2c3f6870dbcc6e49553b8daeedc118627150ab69 100644 --- a/src/runtime2/component/component_context.rs +++ b/src/runtime2/component/component_context.rs @@ -99,7 +99,7 @@ impl CompCtx { 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, self_id) { + if !Self::requires_peer_reference(port, self_id, false) { return; } @@ -124,11 +124,11 @@ 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) { + pub(crate) fn remove_peer(&mut self, sched_ctx: &SchedulerCtx, port_handle: LocalPortHandle, peer_id: CompId, also_remove_if_closed: bool) { 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, self_id) { + if !Self::requires_peer_reference(port, self_id, also_remove_if_closed) { return; } @@ -215,8 +215,8 @@ impl CompCtx { // ------------------------------------------------------------------------- #[inline] - fn requires_peer_reference(port: &Port, self_id: CompId) -> bool { - return port.state != PortState::Closed && port.peer_comp_id != self_id; + fn requires_peer_reference(port: &Port, self_id: CompId, required_if_closed: bool) -> bool { + return (port.state != PortState::Closed || required_if_closed) && port.peer_comp_id != self_id; } fn must_get_port_index(&self, handle: LocalPortHandle) -> usize {