spigot/CraftBukkit-Patches/0092-Remove-DataWatcher-Locking.patch
2021-07-07 00:00:00 +10:00

156 lines
5.8 KiB
Diff

From d41365d3dfeda97cf97c3fd8ee30422c7252e5f8 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Tue, 9 Jul 2019 02:18:54 -0700
Subject: [PATCH] Remove DataWatcher Locking
The lock in DataWatcher is used to prevent concurrent modifications,
however any modifications to this map only occur on initialization of
an Entity in its constructor.
Every other access is through a readlock, which allows the threads to
pass if there is no thread holding the writelock.
Since the writelock is only obtained in the constructor of the Entity,
the further readlocks are actually useless.
This patch also changes the entries map to be fastutil
int2objectopenhashmap for performance.
diff --git a/src/main/java/net/minecraft/network/syncher/DataWatcher.java b/src/main/java/net/minecraft/network/syncher/DataWatcher.java
index 67fd60179..60e3628fe 100644
--- a/src/main/java/net/minecraft/network/syncher/DataWatcher.java
+++ b/src/main/java/net/minecraft/network/syncher/DataWatcher.java
@@ -32,7 +32,7 @@ public class DataWatcher {
private static final int MAX_ID_VALUE = 254;
private final Entity entity;
private final Int2ObjectMap<DataWatcher.Item<?>> itemsById = new Int2ObjectOpenHashMap();
- private final ReadWriteLock lock = new ReentrantReadWriteLock();
+ // private final ReadWriteLock lock = new ReentrantReadWriteLock(); // Spigot - not required
private boolean isEmpty = true;
private boolean isDirty;
@@ -80,7 +80,9 @@ public class DataWatcher {
}
}
+ public boolean registrationLocked; // Spigot
public <T> void register(DataWatcherObject<T> datawatcherobject, T t0) {
+ if (this.registrationLocked) throw new IllegalStateException("Registering datawatcher object after entity initialization"); // Spigot
int i = datawatcherobject.a();
if (i > 254) {
@@ -99,13 +101,15 @@ public class DataWatcher {
private <T> void registerObject(DataWatcherObject<T> datawatcherobject, T t0) {
DataWatcher.Item<T> datawatcher_item = new DataWatcher.Item<>(datawatcherobject, t0);
- this.lock.writeLock().lock();
+ // this.lock.writeLock().lock(); // Spigot - not required
this.itemsById.put(datawatcherobject.a(), datawatcher_item);
this.isEmpty = false;
- this.lock.writeLock().unlock();
+ // this.lock.writeLock().unlock(); // Spigot - not required
}
private <T> DataWatcher.Item<T> b(DataWatcherObject<T> datawatcherobject) {
+ // Spigot start
+ /*
this.lock.readLock().lock();
DataWatcher.Item datawatcher_item;
@@ -123,6 +127,9 @@ public class DataWatcher {
}
return datawatcher_item;
+ */
+ return (DataWatcher.Item) this.itemsById.get(datawatcherobject.a());
+ // Spigot end
}
public <T> T get(DataWatcherObject<T> datawatcherobject) {
@@ -171,7 +178,7 @@ public class DataWatcher {
List<DataWatcher.Item<?>> list = null;
if (this.isDirty) {
- this.lock.readLock().lock();
+ // this.lock.readLock().lock(); // Spigot - not required
ObjectIterator objectiterator = this.itemsById.values().iterator();
while (objectiterator.hasNext()) {
@@ -187,7 +194,7 @@ public class DataWatcher {
}
}
- this.lock.readLock().unlock();
+ // this.lock.readLock().unlock(); // Spigot - not required
}
this.isDirty = false;
@@ -198,7 +205,7 @@ public class DataWatcher {
public List<DataWatcher.Item<?>> getAll() {
List<DataWatcher.Item<?>> list = null;
- this.lock.readLock().lock();
+ // this.lock.readLock().lock(); // Spigot - not required
DataWatcher.Item datawatcher_item;
@@ -209,7 +216,7 @@ public class DataWatcher {
}
}
- this.lock.readLock().unlock();
+ // this.lock.readLock().unlock(); // Spigot - not required
return list;
}
@@ -255,7 +262,7 @@ public class DataWatcher {
}
public void a(List<DataWatcher.Item<?>> list) {
- this.lock.writeLock().lock();
+ // this.lock.writeLock().lock(); // Spigot - not required
try {
Iterator iterator = list.iterator();
@@ -270,7 +277,7 @@ public class DataWatcher {
}
}
} finally {
- this.lock.writeLock().unlock();
+ // this.lock.writeLock().unlock(); // Spigot - not required
}
this.isDirty = true;
@@ -290,7 +297,7 @@ public class DataWatcher {
public void e() {
this.isDirty = false;
- this.lock.readLock().lock();
+ // this.lock.readLock().lock(); // Spigot - not required
ObjectIterator objectiterator = this.itemsById.values().iterator();
while (objectiterator.hasNext()) {
@@ -299,7 +306,7 @@ public class DataWatcher {
datawatcher_item.a(false);
}
- this.lock.readLock().unlock();
+ // this.lock.readLock().unlock(); // Spigot - not required
}
public static class Item<T> {
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 82378e643..e2f4a9fbb 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -337,6 +337,7 @@ public abstract class Entity implements INamableTileEntity, EntityAccess, IComma
this.entityData.register(Entity.DATA_POSE, EntityPose.STANDING);
this.entityData.register(Entity.DATA_TICKS_FROZEN, 0);
this.initDatawatcher();
+ this.getDataWatcher().registrationLocked = true; // Spigot
this.setPosition(0.0D, 0.0D, 0.0D);
this.eyeHeight = this.getHeadHeight(EntityPose.STANDING, this.dimensions);
}
--
2.25.1