synchronize char blocks

This commit is contained in:
Jesse Boyd 2019-11-17 20:02:33 +00:00
parent e661652c12
commit 3f92f12e89
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
3 changed files with 21 additions and 11 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}