mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-25 02:17:35 +01:00
102 lines
4.4 KiB
Diff
102 lines
4.4 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Fri, 29 May 2020 20:29:02 -0400
|
||
|
Subject: [PATCH] Synchronize DataPaletteBlock instead of ReentrantLock
|
||
|
|
||
|
Mojang has flaws in their logic about chunks being concurrently
|
||
|
wrote to. So we constantly see crashes around multiple threads writing.
|
||
|
|
||
|
Additionally, java has optimized synchronization so well that its
|
||
|
in many times faster than trying to manage read wrote locks for low
|
||
|
contention situations.
|
||
|
|
||
|
And this is extremely a low contention situation.
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/DataPaletteBlock.java b/src/main/java/net/minecraft/server/DataPaletteBlock.java
|
||
|
index d5f5a51872dfabdbb828b6c20d61893aed2efec7..3da575929fcf878ebfe18e3240fac84325159225 100644
|
||
|
--- a/src/main/java/net/minecraft/server/DataPaletteBlock.java
|
||
|
+++ b/src/main/java/net/minecraft/server/DataPaletteBlock.java
|
||
|
@@ -24,7 +24,7 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
||
|
private int i; private int getBitsPerObject() { return this.i; } // Paper - OBFHELPER
|
||
|
private final ReentrantLock j = new ReentrantLock();
|
||
|
|
||
|
- public void a() {
|
||
|
+ public void a() { /* // Paper start - disable this - use proper synchronization
|
||
|
if (this.j.isLocked() && !this.j.isHeldByCurrentThread()) {
|
||
|
String s = (String) Thread.getAllStackTraces().keySet().stream().filter(Objects::nonNull).map((thread) -> {
|
||
|
return thread.getName() + ": \n\tat " + (String) Arrays.stream(thread.getStackTrace()).map(Object::toString).collect(Collectors.joining("\n\tat "));
|
||
|
@@ -36,11 +36,11 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
||
|
throw new ReportedException(crashreport);
|
||
|
} else {
|
||
|
this.j.lock();
|
||
|
- }
|
||
|
+ } */ // Paper end
|
||
|
}
|
||
|
|
||
|
public void b() {
|
||
|
- this.j.unlock();
|
||
|
+ //this.j.unlock(); // Paper - disable this
|
||
|
}
|
||
|
|
||
|
public DataPaletteBlock(DataPalette<T> datapalette, RegistryBlockID<T> registryblockid, Function<NBTTagCompound, T> function, Function<T, NBTTagCompound> function1, T t0) {
|
||
|
@@ -76,7 +76,7 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
- public int onResize(int i, T t0) {
|
||
|
+ public synchronized int onResize(int i, T t0) { // Paper - synchronize
|
||
|
this.a();
|
||
|
DataBits databits = this.a;
|
||
|
DataPalette<T> datapalette = this.h;
|
||
|
@@ -99,18 +99,18 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
||
|
}
|
||
|
|
||
|
public T setBlock(int i, int j, int k, T t0) {
|
||
|
- this.a();
|
||
|
- T t1 = this.a(b(i, j, k), t0);
|
||
|
+ //this.a(); // Paper - remove to reduce ops - synchronize handled below
|
||
|
+ return this.a(b(i, j, k), t0); // Paper
|
||
|
|
||
|
- this.b();
|
||
|
- return t1;
|
||
|
+ //this.b(); // Paper
|
||
|
+ //return t1; // PAper
|
||
|
}
|
||
|
|
||
|
public T b(int i, int j, int k, T t0) {
|
||
|
return this.a(b(i, j, k), t0);
|
||
|
}
|
||
|
|
||
|
- protected T a(int i, T t0) {
|
||
|
+ protected synchronized T a(int i, T t0) { // Paper - synchronize - writes
|
||
|
int j = this.h.a(t0);
|
||
|
int k = this.a.a(i, j);
|
||
|
T t1 = this.h.a(k);
|
||
|
@@ -135,7 +135,7 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
||
|
}
|
||
|
|
||
|
public void writeDataPaletteBlock(PacketDataSerializer packetDataSerializer) { this.b(packetDataSerializer); } // Paper - OBFHELPER
|
||
|
- public void b(PacketDataSerializer packetdataserializer) {
|
||
|
+ public synchronized void b(PacketDataSerializer packetdataserializer) { // Paper - synchronize
|
||
|
this.a();
|
||
|
packetdataserializer.writeByte(this.i);
|
||
|
this.h.b(packetdataserializer);
|
||
|
@@ -143,7 +143,7 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
||
|
this.b();
|
||
|
}
|
||
|
|
||
|
- public void a(NBTTagList nbttaglist, long[] along) {
|
||
|
+ public synchronized void a(NBTTagList nbttaglist, long[] along) { // Paper - synchronize
|
||
|
this.a();
|
||
|
int i = Math.max(4, MathHelper.d(nbttaglist.size()));
|
||
|
|
||
|
@@ -176,7 +176,7 @@ public class DataPaletteBlock<T> implements DataPaletteExpandable<T> {
|
||
|
this.b();
|
||
|
}
|
||
|
|
||
|
- public void a(NBTTagCompound nbttagcompound, String s, String s1) {
|
||
|
+ public synchronized void a(NBTTagCompound nbttagcompound, String s, String s1) { // Paper - synchronize
|
||
|
this.a();
|
||
|
DataPaletteHash<T> datapalettehash = new DataPaletteHash<>(this.d, this.i, this.c, this.e, this.f);
|
||
|
T t0 = this.g;
|