From 8c8924f54ee212c96d4c9cb5e2d11cfd5bad9e18 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 23 Aug 2023 09:56:21 +0100 Subject: [PATCH] Fix CME in monitor's set of attached computers We're very inconsistent with whether we use locks or concurrent maps here. Something to sort out in the future, but for now add some missing @GuardedBy annotations. --- .../shared/peripheral/modem/ModemPeripheral.java | 3 ++- .../shared/peripheral/monitor/MonitorBlockEntity.java | 5 +++-- .../shared/peripheral/speaker/SpeakerPeripheral.java | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java index 45be424a3..7b1cf5dfa 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java @@ -4,6 +4,7 @@ package dan200.computercraft.shared.peripheral.modem; +import com.google.errorprone.annotations.concurrent.GuardedBy; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.network.Packet; @@ -85,7 +86,7 @@ import java.util.Set; */ public abstract class ModemPeripheral implements IPeripheral, PacketSender, PacketReceiver { private @Nullable PacketNetwork network; - private final Set computers = new HashSet<>(1); + private final @GuardedBy("computers") Set computers = new HashSet<>(1); private final ModemState state; protected ModemPeripheral(ModemState state) { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java index be2feee1e..3f89c17cd 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java @@ -25,8 +25,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nullable; -import java.util.HashSet; +import java.util.Collections; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; public class MonitorBlockEntity extends BlockEntity { @@ -46,7 +47,7 @@ public class MonitorBlockEntity extends BlockEntity { private @Nullable ServerMonitor serverMonitor; private @Nullable ClientMonitor clientMonitor; private @Nullable MonitorPeripheral peripheral; - private final Set computers = new HashSet<>(); + private final Set computers = Collections.newSetFromMap(new ConcurrentHashMap<>()); private boolean needsUpdate = false; private boolean needsValidating = false; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index c68e4ad71..4a6ab7ef0 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -4,6 +4,7 @@ package dan200.computercraft.shared.peripheral.speaker; +import com.google.errorprone.annotations.concurrent.GuardedBy; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; @@ -57,7 +58,7 @@ public abstract class SpeakerPeripheral implements IPeripheral { public static final int SAMPLE_RATE = 48000; private final UUID source = UUID.randomUUID(); - private final Set computers = new HashSet<>(); + private final @GuardedBy("computers") Set computers = new HashSet<>(); private long clock = 0; private long lastPositionTime;