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);
     }