From 7e5d690c9d0e64159a76563e7399bf8cda59ba4f Mon Sep 17 00:00:00 2001 From: jojo Date: Sun, 19 Jul 2020 14:51:40 +0200 Subject: [PATCH] Fix synchronization Deadlock --- .../de/steamwar/bausystem/tracer/PlayerTraceCache_15.java | 7 ++++++- .../src/de/steamwar/bausystem/tracer/TNTTracer12.java | 6 +++--- .../src/de/steamwar/bausystem/tracer/TNTTracer15.java | 1 + .../de/steamwar/bausystem/tracer/trace/ShowManager.java | 8 ++++++++ .../de/steamwar/bausystem/tracer/trace/ShowStatus.java | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/BauSystem_15/src/de/steamwar/bausystem/tracer/PlayerTraceCache_15.java b/BauSystem_15/src/de/steamwar/bausystem/tracer/PlayerTraceCache_15.java index 16fc7e9..f60583b 100644 --- a/BauSystem_15/src/de/steamwar/bausystem/tracer/PlayerTraceCache_15.java +++ b/BauSystem_15/src/de/steamwar/bausystem/tracer/PlayerTraceCache_15.java @@ -23,6 +23,8 @@ public class PlayerTraceCache_15 { private float[] pLocation; private float locationThreshold = square(10.0F); + private boolean hiding = false; + public PlayerTraceCache_15() { this.pLocation = new float[]{0.0F, 0.0F, 0.0F}; } @@ -49,7 +51,8 @@ public class PlayerTraceCache_15 { return false; } - public synchronized void show(Player player, TNTShowCallback_15.ShowMode showMode) { + public void show(Player player, TNTShowCallback_15.ShowMode showMode) { + if (hiding) return; if (positions.length == 0 || positions.length % 3 != 0) return; for (int i = 0; i < positions.length; i += 3) { float x = positions[i + 0]; @@ -84,6 +87,7 @@ public class PlayerTraceCache_15 { } public synchronized void hide(Player player) { + hiding = true; if (positions.length == 0 || positions.length % 3 != 0) return; for (int i = 0; i < positions.length; i += 3) { float x = positions[i + 0]; @@ -102,6 +106,7 @@ public class PlayerTraceCache_15 { hideBlock(player, x, y + 0.49F, z); } updatePoints = new float[0]; + hiding = false; } private static void showCorner(Player player, float x, float y, float z, Particle particle) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer12.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer12.java index 37fc4fb..8d02563 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer12.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer12.java @@ -29,7 +29,7 @@ public class TNTTracer12 { TNTTracer_12.remove(locations, tnt); } - public static void start(){ + public static void start() { if(status == Status.RECORD) return; stop(); @@ -39,7 +39,7 @@ public class TNTTracer12 { task = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), TNTTracer12::run, 1, 1); } - public static int show(){ + public static int show() { if(status == Status.SHOW) return printedLocs.size(); stop(); @@ -48,7 +48,7 @@ public class TNTTracer12 { return TNTTracer_12.show(locations, printedLocs); } - public static void stop(){ + public static void stop() { status = Status.IDLE; if(task != null) task.cancel(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer15.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer15.java index 2d49dba..af13218 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer15.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer15.java @@ -326,6 +326,7 @@ public class TNTTracer15 { Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText("§7Automatischer TNT-Tracer §8- §aAufnahme gestoppt"))); status = Status.IDLE_AUTO; } + ShowManager.dirty(); if (task != null) task.cancel(); if (tntFrames.getLast().finish()) { tntFrames.removeLast(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowManager.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowManager.java index 5506762..d87f465 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowManager.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowManager.java @@ -15,6 +15,14 @@ public class ShowManager { TNTTracer15.worldInit(); } + public static void dirty() { + for (Map.Entry entry : showMap.entrySet()) { + if (entry.getValue().getShow() != ShowStatus.Show.NONE) { + entry.getValue().dirty = true; + } + } + } + public static void remove(Player player) { showMap.remove(player); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowStatus.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowStatus.java index 0b65c54..a9949d3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowStatus.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/trace/ShowStatus.java @@ -16,7 +16,7 @@ public class ShowStatus { private Player p; - private boolean dirty = false; + boolean dirty = false; public ShowStatus(Player p) { this.p = p;