From 4ed4b8b1f14da2c7efa8a29b6bd015959b9c59c0 Mon Sep 17 00:00:00 2001 From: Spottedleaf 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 f224043d8..bbea8ef72 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, Integer> b = Maps.newHashMap(); private final Entity c; private final Int2ObjectOpenHashMap> 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 void registerObject(DataWatcherObject datawatcherobject, T t0) { DataWatcher.Item 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 DataWatcher.Item b(DataWatcherObject 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)this.d.get(datawatcherobject.a()); // Paper - avoid lock and try catch, get() does not fail } public T get(DataWatcherObject datawatcherobject) { @@ -158,7 +142,7 @@ public class DataWatcher { List> 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> c() { List> 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 { -- 2.21.0