geforkt von Mirrors/FastAsyncWorldEdit
Return to static "sections" in CharBlocks.
- Synchronise (lock) outside the static object - Reduces object creation
Dieser Commit ist enthalten in:
Ursprung
aece0229c4
Commit
7c174ee6b3
@ -9,13 +9,13 @@ import org.jetbrains.annotations.Range;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
public abstract class CharBlocks implements IBlocks {
|
public abstract class CharBlocks implements IBlocks {
|
||||||
|
|
||||||
public static final Logger logger = LoggerFactory.getLogger(CharBlocks.class);
|
public static final Logger logger = LoggerFactory.getLogger(CharBlocks.class);
|
||||||
|
|
||||||
protected final Section FULL = new Section() {
|
protected static final Section FULL = new Section() {
|
||||||
@Override
|
@Override
|
||||||
public final char[] get(CharBlocks blocks, int layer) {
|
public final char[] get(CharBlocks blocks, int layer) {
|
||||||
return blocks.blocks[layer];
|
return blocks.blocks[layer];
|
||||||
@ -26,25 +26,30 @@ public abstract class CharBlocks implements IBlocks {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
protected final Section EMPTY = new Section() {
|
protected static final Section EMPTY = new Section() {
|
||||||
@Override
|
@Override
|
||||||
public final synchronized char[] get(CharBlocks blocks, int layer) {
|
public final char[] get(CharBlocks blocks, int layer) {
|
||||||
char[] arr = blocks.blocks[layer];
|
blocks.loadLock.lock();
|
||||||
if (arr == null) {
|
try {
|
||||||
arr = blocks.blocks[layer] = blocks.update(layer, null);
|
char[] arr = blocks.blocks[layer];
|
||||||
if (arr == null) {
|
if (arr == null) {
|
||||||
throw new IllegalStateException("Array cannot be null: " + blocks.getClass());
|
arr = blocks.blocks[layer] = blocks.update(layer, null);
|
||||||
|
if (arr == null) {
|
||||||
|
throw new IllegalStateException("Array cannot be null: " + blocks.getClass());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
blocks.blocks[layer] = blocks.update(layer, arr);
|
||||||
|
if (blocks.blocks[layer] == null) {
|
||||||
|
throw new IllegalStateException("Array cannot be null (update): " + blocks.getClass());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
if (blocks.blocks[layer] != null) {
|
||||||
blocks.blocks[layer] = blocks.update(layer, arr);
|
blocks.sections[layer] = FULL;
|
||||||
if (blocks.blocks[layer] == null) {
|
|
||||||
throw new IllegalStateException("Array cannot be null (update): " + blocks.getClass());
|
|
||||||
}
|
}
|
||||||
|
return arr;
|
||||||
|
} finally {
|
||||||
|
blocks.loadLock.unlock();
|
||||||
}
|
}
|
||||||
if (blocks.blocks[layer] != null) {
|
|
||||||
blocks.sections[layer] = FULL;
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -54,7 +59,7 @@ public abstract class CharBlocks implements IBlocks {
|
|||||||
};
|
};
|
||||||
public final char[][] blocks;
|
public final char[][] blocks;
|
||||||
public final Section[] sections;
|
public final Section[] sections;
|
||||||
private final Object loadLock = new Object();
|
private final ReentrantLock loadLock = new ReentrantLock ();
|
||||||
|
|
||||||
public CharBlocks() {
|
public CharBlocks() {
|
||||||
blocks = new char[16][];
|
blocks = new char[16][];
|
||||||
@ -117,13 +122,7 @@ public abstract class CharBlocks implements IBlocks {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public char[] load(@Range(from = 0, to = 15) int layer) {
|
public char[] load(@Range(from = 0, to = 15) int layer) {
|
||||||
Section section = sections[layer];
|
return sections[layer].get(this, layer);
|
||||||
if (section.isFull()) {
|
|
||||||
return section.get(this, layer);
|
|
||||||
}
|
|
||||||
synchronized (loadLock) {
|
|
||||||
return sections[layer].get(this, layer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren