You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2023/02/11 05:36:38 UTC
[plc4x] 01/01: fix(plc4j/code-gen): fix for concurrent modification when adding multiple mspecs to context.
This is an automated email from the ASF dual-hosted git repository.
hutcheb pushed a commit to branch fix_code-gen-concurrent-modification
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 181a3d33a03cf552d73f2363b036bae164754615
Author: Ben Hutcheson <be...@gmail.com>
AuthorDate: Sat Feb 11 06:33:00 2023 +0100
fix(plc4j/code-gen): fix for concurrent modification when adding multiple mspecs to context.
---
.../language/mspec/parser/MessageFormatListener.java | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 4f58055b5d..00c3369e7f 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -884,12 +884,19 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
LOGGER.debug("{} waiting for {}", waitingConsumers.size(), typeName);
Iterator<Consumer<TypeDefinition>> consumerIterator = waitingConsumers.iterator();
- while (consumerIterator.hasNext()) {
- Consumer<TypeDefinition> setter = consumerIterator.next();
- LOGGER.debug("setting {} for {}", typeName, setter);
- setter.accept(type);
- consumerIterator.remove();
+ List<Consumer<TypeDefinition>> removedConsumers = new ArrayList<>();
+ try {
+ while (consumerIterator.hasNext()) {
+ Consumer<TypeDefinition> setter = consumerIterator.next();
+ LOGGER.debug("setting {} for {}", typeName, setter);
+ setter.accept(type);
+ removedConsumers.add(setter);
+ }
+ } catch (ConcurrentModificationException e) {
+ LOGGER.debug("");
}
+
+ waitingConsumers.removeAll(removedConsumers);
typeDefinitionConsumers.remove(typeName);
}