mirror of
https://hub.spigotmc.org/stash/scm/spigot/spigot.git
synced 2025-09-18 21:33:01 +00:00
156 lines
5.8 KiB
Diff
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
|
|
|