@@ -0,0 +0,0 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e
protected final LongSet b = new LongOpenHashSet();
protected final LongSet c = new LongOpenHashSet();
protected final LongSet d = new LongOpenHashSet();
- protected volatile M e;
- protected final M f;
+ protected volatile M e_visible; protected final Object visibleUpdateLock = new Object(); // Paper - diff on change, should be "visible" - force compile fail on usage change
+ protected final M f; // Paper - diff on change, should be "updating"
protected final LongSet g = new LongOpenHashSet();
protected final LongSet h = new LongOpenHashSet();
protected final Long2ObjectMap<NibbleArray> i = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap());
@@ -0,0 +0,0 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e
this.l = enumskyblock;
this.m = ilightaccess;
this.f = m0;
- this.e = m0.b();
- this.e.d();
+ this.e_visible = m0.b(); // Paper - avoid copying light data
+ this.e_visible.d(); // Paper - avoid copying light data
}
protected boolean g(long i) {
@@ -0,0 +0,0 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e
@Nullable
protected NibbleArray a(long i, boolean flag) {
- return this.a(flag ? this.f : this.e, i);
+ // Paper start - avoid copying light data
+ if (flag) {
+ return this.a(this.f, i);
+ } else {
+ synchronized (this.visibleUpdateLock) {
+ return this.a(this.e_visible, i);
+ }
+ }
+ // Paper end - avoid copying light data
}
@Nullable
@@ -0,0 +0,0 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e
protected void e() {
if (!this.g.isEmpty()) {
+ synchronized (this.visibleUpdateLock) { // Paper - avoid copying light data
M m0 = this.f.b();
m0.d();
- this.e = m0;
+ this.e_visible = m0; // Paper - avoid copying light data
- super(EnumSkyBlock.BLOCK, ilightaccess, new LightEngineStorageBlock.a(new Long2ObjectOpenHashMap()));
+ super(EnumSkyBlock.BLOCK, ilightaccess, new LightEngineStorageBlock.a(new com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<>(), false)); // Paper - avoid copying light data
}
@Override
@@ -0,0 +0,0 @@ public class LightEngineStorageBlock extends LightEngineStorage<LightEngineStora
public static final class a extends LightEngineStorageArray<LightEngineStorageBlock.a> {
- public a(Long2ObjectOpenHashMap<NibbleArray> long2objectopenhashmap) {
- super(long2objectopenhashmap);
+ public a(com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<NibbleArray> long2objectopenhashmap, boolean isVisible) { // Paper - avoid copying light data
+ super(long2objectopenhashmap, isVisible); // Paper - avoid copying light data
}
@Override
public LightEngineStorageBlock.a b() {
- return new LightEngineStorageBlock.a(this.a.clone());
+ return new a(this.data, true); // Paper - avoid copying light data
- super(EnumSkyBlock.SKY, ilightaccess, new LightEngineStorageSky.a(new Long2ObjectOpenHashMap(), new Long2IntOpenHashMap(), Integer.MAX_VALUE));
+ super(EnumSkyBlock.SKY, ilightaccess, new LightEngineStorageSky.a(new com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<>(), new com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int(), Integer.MAX_VALUE, false)); // Paper - avoid copying light data
- int l = lightenginestoragesky_a.c.get(SectionPosition.f(j));
+ synchronized (this.visibleUpdateLock) { // Paper - avoid copying light data
+ LightEngineStorageSky.a lightenginestoragesky_a = (LightEngineStorageSky.a) this.e_visible; // Paper - avoid copying light data - must be after lock acquire
+ int l = lightenginestoragesky_a.otherData.getVisibleAsync(SectionPosition.f(j)); // Paper - avoid copying light data
if (l != lightenginestoragesky_a.b && k < l) {
NibbleArray nibblearray = this.a(lightenginestoragesky_a, j); // Paper - decompile fix
@@ -0,0 +0,0 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage
} else {
return 15;
}
+ } // Paper - avoid copying light data
}
@Override
@@ -0,0 +0,0 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage
+ public a(com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<NibbleArray> data, com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int otherData, int i, boolean isVisible) {