From f20a364f65b005fbd46f04018096e3d8281cbeba Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sat, 7 Aug 2021 14:12:49 +0200 Subject: [PATCH] Fix ConcurrentModificationException --- .../ctbrec/recorder/NextGenLocalRecorder.java | 29 +++++++++++++++---- .../java/ctbrec/recorder/RemoteRecorder.java | 2 +- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java index 97f477bc..6cba4cf9 100644 --- a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java @@ -17,6 +17,7 @@ import java.time.ZoneId; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -68,6 +69,7 @@ public class NextGenLocalRecorder implements Recorder { private Config config; private volatile boolean recording = true; private ReentrantLock recorderLock = new ReentrantLock(); + private ReentrantLock modelGroupLock = new ReentrantLock(); private RecorderHttpClient client = new RecorderHttpClient(); private Map recordingProcesses = Collections.synchronizedMap(new HashMap<>()); private RecordingManager recordingManager; @@ -808,20 +810,35 @@ public class NextGenLocalRecorder implements Recorder { @Override public Set getModelGroups() { - return config.getSettings().modelGroups; + modelGroupLock.lock(); + try { + return new HashSet<>(config.getSettings().modelGroups); + } finally { + modelGroupLock.unlock(); + } } @Override public void saveModelGroup(ModelGroup group) throws IOException { Set modelGroups = config.getSettings().modelGroups; - modelGroups.remove(group); - modelGroups.add(group); - config.save(); + modelGroupLock.lock(); + try { + modelGroups.remove(group); + modelGroups.add(group); + config.save(); + } finally { + modelGroupLock.unlock(); + } } @Override public void deleteModelGroup(ModelGroup group) throws IOException { - config.getSettings().modelGroups.remove(group); - config.save(); + modelGroupLock.lock(); + try { + config.getSettings().modelGroups.remove(group); + config.save(); + } finally { + modelGroupLock.unlock(); + } } } diff --git a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java index 1930b0b9..7552fbab 100644 --- a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java +++ b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java @@ -691,7 +691,7 @@ public class RemoteRecorder implements Recorder { @Override public Set getModelGroups() { - return modelGroups; + return new HashSet<>(modelGroups); } @Override