From 97209d5680f6a7585f123919c957b83ea9db17ee Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 13 Jan 2021 17:24:14 +0000 Subject: [PATCH] better locking of lighting and use correct method for relight without removing first Fixes #847 --- .../implementation/lighting/NMSRelighter.java | 9 ++++++++ .../lighting/NullRelighter.java | 5 +++++ .../implementation/lighting/Relighter.java | 7 +++++++ .../java/com/sk89q/worldedit/EditSession.java | 21 ++++++++----------- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NMSRelighter.java b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NMSRelighter.java index 37c38005a..87f368f06 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NMSRelighter.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NMSRelighter.java @@ -71,6 +71,7 @@ public class NMSRelighter implements Relighter { private final int maxY; private final boolean calculateHeightMaps; private final ReentrantLock lightingLock; + private final AtomicBoolean finished = new AtomicBoolean(false); private boolean removeFirst; public NMSRelighter(IQueueExtent queue, boolean calculateHeightMaps) { @@ -99,6 +100,11 @@ public class NMSRelighter implements Relighter { return lightingLock; } + @Override + public boolean isFinished() { + return finished.get(); + } + @Override public synchronized void removeAndRelight(boolean sky) { removeFirst = true; fixLightingSafe(sky); @@ -839,10 +845,12 @@ public class NMSRelighter implements Relighter { } if (Settings.IMP.LIGHTING.ASYNC) { queue.flush(); + finished.set(true); } else { TaskManager.IMP.sync(new RunnableVal() { @Override public void run(Object value) { queue.flush(); + finished.set(true); } }); } @@ -873,6 +881,7 @@ public class NMSRelighter implements Relighter { Fawe.imp().getPlatformAdapter().sendChunk(chunk.getOrCreateGet(), bitMask, true); iter.remove(); } + finished.set(true); } }; if (Settings.IMP.LIGHTING.ASYNC) { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NullRelighter.java b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NullRelighter.java index fe9eb28b3..1c345df1b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NullRelighter.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NullRelighter.java @@ -53,4 +53,9 @@ public class NullRelighter implements Relighter { public ReentrantLock getLock() { return null; } + + @Override + public boolean isFinished() { + return true; + } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/Relighter.java b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/Relighter.java index 99f809075..61fbc2d87 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/Relighter.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/Relighter.java @@ -70,6 +70,13 @@ public interface Relighter { ReentrantLock getLock(); + /** + * Returns true if the Relighter has been flushed + * + * @return true if finished + */ + boolean isFinished(); + class SkipReason { public static final byte NONE = 0; public static final byte AIR = 1; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index 5ace70cbf..2036a419f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -1098,18 +1098,15 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { limit.set(originalLimit); try { if (relighter != null && !(relighter instanceof NullRelighter)) { - // Only relight once! - if (Settings.IMP.LIGHTING.DELAY_PACKET_SENDING && !relighter.getLock().tryLock()) { - relighter.getLock().lock(); - relighter.getLock().unlock(); - } else { - if (Settings.IMP.LIGHTING.REMOVE_FIRST) { - relighter.removeAndRelight(true); - } else { - relighter.fixSkyLighting(); - relighter.fixBlockLighting(); - } - if (Settings.IMP.LIGHTING.DELAY_PACKET_SENDING) { + // Don't relight twice! + if (!relighter.isFinished() && relighter.getLock().tryLock()) { + try { + if (Settings.IMP.LIGHTING.REMOVE_FIRST) { + relighter.removeAndRelight(true); + } else { + relighter.fixLightingSafe(true); + } + } finally { relighter.getLock().unlock(); } }