From 461ac034f8fddb0cd028856f0b8584f5296b6f7d Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Tue, 19 Dec 2023 23:12:13 +1300 Subject: [PATCH] Avoid double-execution within a round; see https://git.syndicate-lang.org/syndicate-lang/syndicate-js/issues/3 --- syndicate/src/actor.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/syndicate/src/actor.rs b/syndicate/src/actor.rs index 992ee60..026a175 100644 --- a/syndicate/src/actor.rs +++ b/syndicate/src/actor.rs @@ -1547,13 +1547,17 @@ impl<'activation> Activation<'activation> { pass_number += 1; tracing::trace!(?pass_number, "repair_dataflow"); let damaged_field_ids = self.state.dataflow.take_damaged_nodes(); + let mut executed_blocks = Set::new(); for field_id in damaged_field_ids.into_iter() { let block_ids = self.state.dataflow.take_observers_of(&field_id); for block_id in block_ids.into_iter() { - if let Some((facet_id, mut block)) = self.state.blocks.remove(&block_id) { - let result = self.with_facet(facet_id, |t| t.with_block(block_id, &mut block)); - self.state.blocks.insert(block_id, (facet_id, block)); - result?; + if !executed_blocks.contains(&block_id) { + executed_blocks.insert(block_id); + if let Some((facet_id, mut block)) = self.state.blocks.remove(&block_id) { + let result = self.with_facet(facet_id, |t| t.with_block(block_id, &mut block)); + self.state.blocks.insert(block_id, (facet_id, block)); + result?; + } } } }