diff --git a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java index be0203337e..4058313e29 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java @@ -1001,19 +1001,29 @@ public boolean hasNonEmptySection(int layer) { @Override @SuppressWarnings("unchecked") - public synchronized boolean trim(boolean aggressive) { - skyLight = new DataLayer[getSectionCount()]; - blockLight = new DataLayer[getSectionCount()]; + public boolean trim(boolean aggressive) { + synchronized (this) { + if (sections == null && (!aggressive || levelChunk == null)) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + return !aggressive || super.trim(true); + } + } if (aggressive) { sectionLock.writeLock().lock(); - sections = null; - levelChunk = null; - sectionLock.writeLock().unlock(); - return super.trim(true); - } else if (sections == null) { - // don't bother trimming if there are no sections stored. - return true; - } else { + try { + synchronized (this) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + sections = null; + levelChunk = null; + return super.trim(true); + } + } finally { + sectionLock.writeLock().unlock(); + } + } + synchronized (this) { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); if (!hasSection(i) || super.blocks[layer] == null) { diff --git a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java index b08afe5456..1c59c098e4 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java @@ -1002,19 +1002,29 @@ public boolean hasNonEmptySection(int layer) { @Override @SuppressWarnings("unchecked") - public synchronized boolean trim(boolean aggressive) { - skyLight = new DataLayer[getSectionCount()]; - blockLight = new DataLayer[getSectionCount()]; + public boolean trim(boolean aggressive) { + synchronized (this) { + if (sections == null && (!aggressive || levelChunk == null)) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + return !aggressive || super.trim(true); + } + } if (aggressive) { sectionLock.writeLock().lock(); - sections = null; - levelChunk = null; - sectionLock.writeLock().unlock(); - return super.trim(true); - } else if (sections == null) { - // don't bother trimming if there are no sections stored. - return true; - } else { + try { + synchronized (this) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + sections = null; + levelChunk = null; + return super.trim(true); + } + } finally { + sectionLock.writeLock().unlock(); + } + } + synchronized (this) { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); if (!hasSection(i) || super.blocks[layer] == null) { diff --git a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java index a03f3d9475..352d3beed2 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightGetBlocks.java @@ -1003,19 +1003,29 @@ public boolean hasNonEmptySection(int layer) { @Override @SuppressWarnings("unchecked") - public synchronized boolean trim(boolean aggressive) { - skyLight = new DataLayer[getSectionCount()]; - blockLight = new DataLayer[getSectionCount()]; + public boolean trim(boolean aggressive) { + synchronized (this) { + if (sections == null && (!aggressive || levelChunk == null)) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + return !aggressive || super.trim(true); + } + } if (aggressive) { sectionLock.writeLock().lock(); - sections = null; - levelChunk = null; - sectionLock.writeLock().unlock(); - return super.trim(true); - } else if (sections == null) { - // don't bother trimming if there are no sections stored. - return true; - } else { + try { + synchronized (this) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + sections = null; + levelChunk = null; + return super.trim(true); + } + } finally { + sectionLock.writeLock().unlock(); + } + } + synchronized (this) { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); if (!hasSection(i) || super.blocks[layer] == null) { diff --git a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java index 9fbc1ef64e..436c28f981 100644 --- a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightGetBlocks.java @@ -1037,19 +1037,29 @@ public boolean hasNonEmptySection(int layer) { @Override @SuppressWarnings("unchecked") - public synchronized boolean trim(boolean aggressive) { - skyLight = new DataLayer[getSectionCount()]; - blockLight = new DataLayer[getSectionCount()]; + public boolean trim(boolean aggressive) { + synchronized (this) { + if (sections == null && (!aggressive || levelChunk == null)) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + return !aggressive || super.trim(true); + } + } if (aggressive) { sectionLock.writeLock().lock(); - sections = null; - levelChunk = null; - sectionLock.writeLock().unlock(); - return super.trim(true); - } else if (sections == null) { - // don't bother trimming if there are no sections stored. - return true; - } else { + try { + synchronized (this) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + sections = null; + levelChunk = null; + return super.trim(true); + } + } finally { + sectionLock.writeLock().unlock(); + } + } + synchronized (this) { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); if (!hasSection(i) || super.blocks[layer] == null) { diff --git a/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java index c2bbe67998..76daebf000 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightGetBlocks.java @@ -996,19 +996,29 @@ public boolean hasNonEmptySection(int layer) { @Override @SuppressWarnings("unchecked") - public synchronized boolean trim(boolean aggressive) { - skyLight = new DataLayer[getSectionCount()]; - blockLight = new DataLayer[getSectionCount()]; + public boolean trim(boolean aggressive) { + synchronized (this) { + if (sections == null && (!aggressive || levelChunk == null)) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + return !aggressive || super.trim(true); + } + } if (aggressive) { sectionLock.writeLock().lock(); - sections = null; - levelChunk = null; - sectionLock.writeLock().unlock(); - return super.trim(true); - } else if (sections == null) { - // don't bother trimming if there are no sections stored. - return true; - } else { + try { + synchronized (this) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + sections = null; + levelChunk = null; + return super.trim(true); + } + } finally { + sectionLock.writeLock().unlock(); + } + } + synchronized (this) { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); if (!hasSection(i) || super.blocks[layer] == null) { diff --git a/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightGetBlocks.java index 77e918f003..058715b262 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightGetBlocks.java @@ -996,19 +996,29 @@ public boolean hasNonEmptySection(int layer) { @Override @SuppressWarnings("unchecked") - public synchronized boolean trim(boolean aggressive) { - skyLight = new DataLayer[getSectionCount()]; - blockLight = new DataLayer[getSectionCount()]; + public boolean trim(boolean aggressive) { + synchronized (this) { + if (sections == null && (!aggressive || levelChunk == null)) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + return !aggressive || super.trim(true); + } + } if (aggressive) { sectionLock.writeLock().lock(); - sections = null; - levelChunk = null; - sectionLock.writeLock().unlock(); - return super.trim(true); - } else if (sections == null) { - // don't bother trimming if there are no sections stored. - return true; - } else { + try { + synchronized (this) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + sections = null; + levelChunk = null; + return super.trim(true); + } + } finally { + sectionLock.writeLock().unlock(); + } + } + synchronized (this) { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); if (!hasSection(i) || super.blocks[layer] == null) { diff --git a/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightGetBlocks.java index d88bd0f3d3..5fde41ab30 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightGetBlocks.java @@ -1004,19 +1004,29 @@ public boolean hasNonEmptySection(int layer) { @Override @SuppressWarnings("unchecked") - public synchronized boolean trim(boolean aggressive) { - skyLight = new DataLayer[getSectionCount()]; - blockLight = new DataLayer[getSectionCount()]; + public boolean trim(boolean aggressive) { + synchronized (this) { + if (sections == null && (!aggressive || levelChunk == null)) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + return !aggressive || super.trim(true); + } + } if (aggressive) { sectionLock.writeLock().lock(); - sections = null; - levelChunk = null; - sectionLock.writeLock().unlock(); - return super.trim(true); - } else if (sections == null) { - // don't bother trimming if there are no sections stored. - return true; - } else { + try { + synchronized (this) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + sections = null; + levelChunk = null; + return super.trim(true); + } + } finally { + sectionLock.writeLock().unlock(); + } + } + synchronized (this) { for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { int layer = i - getMinSectionPosition(); if (!hasSection(i) || super.blocks[layer] == null) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkCache.java index acf74d252a..f9de519ca7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkCache.java @@ -62,9 +62,8 @@ public synchronized boolean trim(boolean aggressive) { if (!aggressive) { return false; } - synchronized (igb) { - igb.trim(true); - } + // Don't synchronise here, let the implementation handle it + igb.trim(true); } } return result;