geforkt von Mirrors/Paper
5c7081fecc
* Updated Upstream (Bukkit/CraftBukkit) Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 45690fe9 SPIGOT-5047: Correct slot types for 1.14 inventories CraftBukkit Changes:4090d01f
SPIGOT-5047: Correct slot types for 1.14 inventoriese8c08362
SPIGOT-5046: World#getLoadedChunks returning inaccessible cached chunks.d445af3b
SPIGOT-5067: Add item meta for 1.14 spawn eggs * Bring Chunk load checks in-line with spigot As of the last upstream merge spigot now checks ticket level status when returning loaded chunks for a world from api. Now our checks will respect that decision. * Fix spawn ticket levels Vanilla would keep the inner chunks of spawn available for ticking, however my changes made all chunks non-ticking. Resolve by changing ticket levels for spawn chunks inside the border to respect this behavior. * Make World#getChunkIfLoadedImmediately return only entity ticking chunks Mojang appears to be using chunks with level > 33 (non-ticking chunks) as cached chunks and not actually loaded chunks. * Bring all loaded checks in line with spigot Loaded chunks must be at least border chunks, or level <= 33
141 Zeilen
5.0 KiB
Diff
141 Zeilen
5.0 KiB
Diff
From 51fd7997bca218ef386063113130b7108f779682 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Sat, 11 May 2019 08:19:27 -0700
|
|
Subject: [PATCH] Elide lock in DataWatcher
|
|
|
|
The lock in DataWatcher is used to prevent concurrent modifications
|
|
to the 'd' field (entries in MCP). However any modifications to
|
|
this map only occur on initialization of an Entity in its
|
|
constructor. This modification is write-locked.
|
|
|
|
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 (which get obtained on set, get, etc calls).
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/DataWatcher.java b/src/main/java/net/minecraft/server/DataWatcher.java
|
|
index f224043d8e..bbea8ef726 100644
|
|
--- a/src/main/java/net/minecraft/server/DataWatcher.java
|
|
+++ b/src/main/java/net/minecraft/server/DataWatcher.java
|
|
@@ -23,7 +23,7 @@ public class DataWatcher {
|
|
private static final Map<Class<? extends Entity>, Integer> b = Maps.newHashMap();
|
|
private final Entity c;
|
|
private final Int2ObjectOpenHashMap<DataWatcher.Item<?>> d = new Int2ObjectOpenHashMap<>(); // Paper
|
|
- private final ReadWriteLock e = new ReentrantReadWriteLock();
|
|
+ //private final ReadWriteLock e = new ReentrantReadWriteLock(); // Paper - not required
|
|
private boolean f = true;
|
|
private boolean g;
|
|
|
|
@@ -88,30 +88,14 @@ public class DataWatcher {
|
|
private <T> void registerObject(DataWatcherObject<T> datawatcherobject, T t0) {
|
|
DataWatcher.Item<T> datawatcher_item = new DataWatcher.Item<>(datawatcherobject, t0);
|
|
|
|
- this.e.writeLock().lock();
|
|
+ //this.e.writeLock().lock(); // Paper - not required
|
|
this.d.put(datawatcherobject.a(), datawatcher_item);
|
|
this.f = false;
|
|
- this.e.writeLock().unlock();
|
|
+ //this.e.writeLock().unlock(); // Paper - not required
|
|
}
|
|
|
|
private <T> DataWatcher.Item<T> b(DataWatcherObject<T> datawatcherobject) {
|
|
- this.e.readLock().lock();
|
|
-
|
|
- DataWatcher.Item datawatcher_item;
|
|
-
|
|
- try {
|
|
- datawatcher_item = (DataWatcher.Item) this.d.get(datawatcherobject.a());
|
|
- } catch (Throwable throwable) {
|
|
- CrashReport crashreport = CrashReport.a(throwable, "Getting synched entity data");
|
|
- CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Synched entity data");
|
|
-
|
|
- crashreportsystemdetails.a("Data ID", (Object) datawatcherobject);
|
|
- throw new ReportedException(crashreport);
|
|
- } finally {
|
|
- this.e.readLock().unlock();
|
|
- }
|
|
-
|
|
- return datawatcher_item;
|
|
+ return (DataWatcher.Item<T>)this.d.get(datawatcherobject.a()); // Paper - avoid lock and try catch, get() does not fail
|
|
}
|
|
|
|
public <T> T get(DataWatcherObject<T> datawatcherobject) {
|
|
@@ -158,7 +142,7 @@ public class DataWatcher {
|
|
List<DataWatcher.Item<?>> list = null;
|
|
|
|
if (this.g) {
|
|
- this.e.readLock().lock();
|
|
+ //this.e.readLock().lock(); // Paper - not required
|
|
Iterator iterator = this.d.values().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
@@ -174,7 +158,7 @@ public class DataWatcher {
|
|
}
|
|
}
|
|
|
|
- this.e.readLock().unlock();
|
|
+ //this.e.readLock().unlock(); // Paper - not required
|
|
}
|
|
|
|
this.g = false;
|
|
@@ -182,7 +166,7 @@ public class DataWatcher {
|
|
}
|
|
|
|
public void a(PacketDataSerializer packetdataserializer) throws IOException {
|
|
- this.e.readLock().lock();
|
|
+ //this.e.readLock().lock(); // Paper - not required
|
|
Iterator iterator = this.d.values().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
@@ -191,7 +175,7 @@ public class DataWatcher {
|
|
a(packetdataserializer, datawatcher_item);
|
|
}
|
|
|
|
- this.e.readLock().unlock();
|
|
+ //this.e.readLock().unlock(); // Paper - not required
|
|
packetdataserializer.writeByte(255);
|
|
}
|
|
|
|
@@ -199,7 +183,7 @@ public class DataWatcher {
|
|
public List<DataWatcher.Item<?>> c() {
|
|
List<DataWatcher.Item<?>> list = null;
|
|
|
|
- this.e.readLock().lock();
|
|
+ //this.e.readLock().lock(); // Paper - not required
|
|
|
|
DataWatcher.Item datawatcher_item;
|
|
|
|
@@ -210,7 +194,7 @@ public class DataWatcher {
|
|
}
|
|
}
|
|
|
|
- this.e.readLock().unlock();
|
|
+ //this.e.readLock().unlock(); // Paper - not required
|
|
return list;
|
|
}
|
|
|
|
@@ -261,7 +245,7 @@ public class DataWatcher {
|
|
|
|
public void e() {
|
|
this.g = false;
|
|
- this.e.readLock().lock();
|
|
+ //this.e.readLock().lock(); // Paper - not required
|
|
Iterator iterator = this.d.values().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
@@ -270,7 +254,7 @@ public class DataWatcher {
|
|
datawatcher_item.a(false);
|
|
}
|
|
|
|
- this.e.readLock().unlock();
|
|
+ //this.e.readLock().unlock(); // Paper - not required
|
|
}
|
|
|
|
public static class Item<T> {
|
|
--
|
|
2.21.0
|
|
|