This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit bfcf6b8c3a46504072bc0ce92ecbf193f6f10400
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Jul 10 16:33:30 2026 +0200

    TUI: Fix thread-safety for errors list and selectedPid/lastSelectedName
    
    - IntegrationInfo: Use CopyOnWriteArrayList for errors to prevent CME
      when background refresh does clear/addAll while render thread iterates
    - MonitorContext: Make selectedPid and lastSelectedName volatile so
      writes from the refresh thread are visible to the render thread
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../org/apache/camel/dsl/jbang/core/commands/tui/IntegrationInfo.java | 3 ++-
 .../org/apache/camel/dsl/jbang/core/commands/tui/MonitorContext.java  | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/IntegrationInfo.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/IntegrationInfo.java
index 93820acd05a8..97d973f097ec 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/IntegrationInfo.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/IntegrationInfo.java
@@ -18,6 +18,7 @@ package org.apache.camel.dsl.jbang.core.commands.tui;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 class IntegrationInfo {
     String pid;
@@ -84,7 +85,7 @@ class IntegrationInfo {
     final List<EndpointInfo> endpoints = new ArrayList<>();
     final List<CircuitBreakerInfo> circuitBreakers = new ArrayList<>();
     int errorCount;
-    final List<ErrorInfo> errors = new ArrayList<>();
+    final List<ErrorInfo> errors = new CopyOnWriteArrayList<>();
     boolean inflightBrowseEnabled;
     final List<InflightInfo> inflightExchanges = new ArrayList<>();
     final List<MicrometerMeterInfo> meters = new ArrayList<>();
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MonitorContext.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MonitorContext.java
index 69eabda1770b..6bde687680f3 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MonitorContext.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MonitorContext.java
@@ -32,8 +32,8 @@ class MonitorContext {
     final AtomicReference<List<InfraInfo>> infraData;
     TuiRunner runner;
 
-    String selectedPid;
-    String lastSelectedName;
+    volatile String selectedPid;
+    volatile String lastSelectedName;
     int shellPercent;
     boolean logPinned;
     int logPinPercent;

Reply via email to