From 3f92f12e89a80e38c79e04c74257cf044d23f2fe Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Sun, 17 Nov 2019 20:02:33 +0000 Subject: [PATCH] synchronize char blocks --- .../adapter/mc1_14/BukkitGetBlocks_1_14.java | 2 ++ .../implementation/blocks/CharBlocks.java | 22 ++++++++++++------- .../implementation/blocks/CharGetBlocks.java | 8 ++++--- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_14/BukkitGetBlocks_1_14.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_14/BukkitGetBlocks_1_14.java index 3de8bc89b..a5829ec5b 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_14/BukkitGetBlocks_1_14.java +++ b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_14/BukkitGetBlocks_1_14.java @@ -1,5 +1,6 @@ package com.boydti.fawe.bukkit.adapter.mc1_14; +import static com.google.common.base.Preconditions.checkNotNull; import static org.slf4j.LoggerFactory.getLogger; import com.boydti.fawe.Fawe; @@ -210,6 +211,7 @@ public class BukkitGetBlocks_1_14 extends CharGetBlocks { } private void updateGet(BukkitGetBlocks_1_14 get, Chunk nmsChunk, ChunkSection[] sections, ChunkSection section, char[] arr, int layer) { + checkNotNull(arr); synchronized (get) { if (this.nmsChunk != nmsChunk) { this.nmsChunk = nmsChunk; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharBlocks.java b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharBlocks.java index 5cd894008..fe5ec23ad 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharBlocks.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharBlocks.java @@ -16,7 +16,6 @@ public abstract class CharBlocks implements IBlocks { public static final Section EMPTY = new Section() { @Override public final char[] get(CharBlocks blocks, int layer) { - blocks.sections[layer] = FULL; char[] arr = blocks.blocks[layer]; if (arr == null) { arr = blocks.blocks[layer] = blocks.update(layer, null); @@ -25,6 +24,14 @@ public abstract class CharBlocks implements IBlocks { } } else { blocks.blocks[layer] = blocks.update(layer, arr); + if (blocks.blocks[layer] == null) { + throw new IllegalStateException("Array cannot be null (update): " + blocks.getClass()); + } + } + synchronized (this) { + if (blocks.blocks[layer] != null) { + blocks.sections[layer] = FULL; + } } return arr; } @@ -32,11 +39,6 @@ public abstract class CharBlocks implements IBlocks { public final char[][] blocks; public final Section[] sections; - public CharBlocks(CharBlocks other) { - this.blocks = other.blocks; - this.sections = other.sections; - } - public CharBlocks() { blocks = new char[16][]; sections = new Section[16]; @@ -49,8 +51,12 @@ public abstract class CharBlocks implements IBlocks { public boolean trim(boolean aggressive) { boolean result = true; for (int i = 0; i < 16; i++) { - if (sections[i] == EMPTY) { - blocks[i] = null; + if (sections[i] == EMPTY && blocks[i] != null) { + synchronized (this) { + if (sections[i] == EMPTY && blocks[i] != null) { + blocks[i] = null; + } + } } else { result = false; } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharGetBlocks.java b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharGetBlocks.java index 9304969f3..a0ff14a58 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharGetBlocks.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharGetBlocks.java @@ -21,9 +21,11 @@ public abstract class CharGetBlocks extends CharBlocks implements IChunkGet { @Override public boolean trim(boolean aggressive) { - for (int i = 0; i < 16; i++) { - sections[i] = EMPTY; - blocks[i] = null; + synchronized (this) { + for (int i = 0; i < 16; i++) { + sections[i] = EMPTY; + blocks[i] = null; + } } return true; }