diff --git a/src/runtime2/component/component_pdl.rs b/src/runtime2/component/component_pdl.rs index 8278f9b270dbf19094fabca7e6de128b79f9d9a0..f38875e2ea0a113a9f4d5dcda5cc35f60ca5ae43 100644 --- a/src/runtime2/component/component_pdl.rs +++ b/src/runtime2/component/component_pdl.rs @@ -763,16 +763,28 @@ impl CompPDL { } } - // Do the same for the closed ports + // Do the same for the closed ports. Note that we might still have to + // transfer messages that cause the new owner of the port to fail. for pair in closed_port_id_pairs.iter() { let port_index = creator_ctx.get_port_index(pair.creator_handle); creator_ctx.remove_port(pair.creator_handle); - let _removed_message = self.inbox_main.remove(port_index); + if let Some(mut message) = self.inbox_main.remove(port_index) { + message.data_header.target_port = pair.created_id; + component.component.adopt_message(&mut component.ctx, message); + } - // In debug mode: since we've closed the port we shouldn't have any - // messages for that port. - debug_assert!(_removed_message.is_none()); - debug_assert!(!self.inbox_backup.iter().any(|v| v.data_header.target_port == pair.creator_id)); + let mut message_index = 0; + while message_index < self.inbox_backup.len() { + let message = &self.inbox_backup[message_index]; + if message.data_header.target_port == pair.created_id { + // Transfer message + let mut message = self.inbox_backup.remove(message_index); + message.data_header.target_port = pair.created_id; + component.component.adopt_message(&mut component.ctx, message); + } else { + message_index += 1; + } + } } // By now all ports and messages have been transferred. If there are any