diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldManager.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldManager.java index 8105b54f9..1c1ca66ab 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldManager.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldManager.java @@ -16,9 +16,9 @@ public abstract class MixinWorldManager { @Overwrite public void a(Entity entity) { - this.world.getTracker().entriesLock.writeLock().lock(); // Akarin + synchronized (this.world.getTracker().entriesLock) { // Akarin this.world.getTracker().track(entity); - this.world.getTracker().entriesLock.writeLock().unlock(); // Akarin + } // Akarin if (entity instanceof EntityPlayer) { this.world.worldProvider.a((EntityPlayer) entity); diff --git a/sources/src/main/java/net/minecraft/server/EntityPlayer.java b/sources/src/main/java/net/minecraft/server/EntityPlayer.java index 522c67f8e..756933466 100644 --- a/sources/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/sources/src/main/java/net/minecraft/server/EntityPlayer.java @@ -762,9 +762,9 @@ public class EntityPlayer extends EntityHuman implements ICrafting { if (entity instanceof EntityPlayer) { WorldServer worldServer = (WorldServer) entity.getWorld(); worldServer.tracker.untrackEntity(this); - worldServer.tracker.entriesLock.writeLock().lock(); // Akarin - ProtocolSupport will overwrite track method + synchronized (worldServer.tracker.entriesLock) { // Akarin worldServer.tracker.track(this); - worldServer.tracker.entriesLock.writeLock().unlock(); // Akarin - ProtocolSupport will overwrite track method + } // Akarin } // Paper end diff --git a/sources/src/main/java/net/minecraft/server/EntityTracker.java b/sources/src/main/java/net/minecraft/server/EntityTracker.java index e7da005aa..f61e5b237 100644 --- a/sources/src/main/java/net/minecraft/server/EntityTracker.java +++ b/sources/src/main/java/net/minecraft/server/EntityTracker.java @@ -23,7 +23,7 @@ public class EntityTracker { private static final Logger a = LogManager.getLogger(); private final WorldServer world; private final Set c = Sets.newHashSet(); - public final ReentrantReadWriteUpdateLock entriesLock = new ReentrantReadWriteUpdateLock(); // Akarin - add lock + public final Object entriesLock = new Object(); // Akarin - add lock public final IntHashMap trackedEntities = new IntHashMap(); private int e; @@ -160,7 +160,7 @@ public class EntityTracker { public void untrackEntity(Entity entity) { org.spigotmc.AsyncCatcher.catchOp( "entity untrack"); // Spigot - entriesLock.writeLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin if (entity instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer) entity; Iterator iterator = this.c.iterator(); @@ -179,14 +179,14 @@ public class EntityTracker { entitytrackerentry1.a(); } - entriesLock.writeLock().unlock(); // Akarin + } // Akarin } public void updatePlayers() { ArrayList arraylist = Lists.newArrayList(); Iterator iterator = this.c.iterator(); world.timings.tracker1.startTiming(); // Spigot - entriesLock.writeLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin while (iterator.hasNext()) { EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); @@ -214,14 +214,14 @@ public class EntityTracker { } } } - entriesLock.writeLock().unlock(); // Akarin + } // Akarin world.timings.tracker2.stopTiming(); // Spigot } public void a(EntityPlayer entityplayer) { Iterator iterator = this.c.iterator(); - entriesLock.writeLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin while (iterator.hasNext()) { EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); @@ -233,34 +233,34 @@ public class EntityTracker { } } - entriesLock.writeLock().unlock(); // Akarin + } // Akarin } public void a(Entity entity, Packet packet) { - entriesLock.readLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) this.trackedEntities.get(entity.getId()); - entriesLock.readLock().unlock(); // Akarin if (entitytrackerentry != null) { entitytrackerentry.broadcast(packet); } + } // Akarin } public void sendPacketToEntity(Entity entity, Packet packet) { - entriesLock.readLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) this.trackedEntities.get(entity.getId()); - entriesLock.readLock().unlock(); // Akarin if (entitytrackerentry != null) { entitytrackerentry.broadcastIncludingSelf(packet); } + } // Akarin } public void untrackPlayer(EntityPlayer entityplayer) { Iterator iterator = this.c.iterator(); - entriesLock.writeLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin while (iterator.hasNext()) { EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); @@ -268,14 +268,14 @@ public class EntityTracker { entitytrackerentry.clear(entityplayer); } - entriesLock.writeLock().unlock(); // Akarin + } // Akarin } public void a(EntityPlayer entityplayer, Chunk chunk) { ArrayList arraylist = Lists.newArrayList(); ArrayList arraylist1 = Lists.newArrayList(); Iterator iterator = this.c.iterator(); - entriesLock.writeLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin while (iterator.hasNext()) { EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); @@ -292,7 +292,7 @@ public class EntityTracker { } } } - entriesLock.writeLock().unlock(); // Akarin + } // Akarin Entity entity1; @@ -319,7 +319,7 @@ public class EntityTracker { public void a(int i) { this.e = (i - 1) * 16; Iterator iterator = this.c.iterator(); - entriesLock.readLock().lock(); // Akarin + synchronized (entriesLock) { // Akarin while (iterator.hasNext()) { EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); @@ -327,6 +327,6 @@ public class EntityTracker { entitytrackerentry.a(this.e); } - entriesLock.readLock().unlock(); // Akarin + } // Akarin } } diff --git a/sources/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/sources/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index b56943664..e2ba44ec8 100644 --- a/sources/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/sources/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1197,14 +1197,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { EntityTracker tracker = ((WorldServer) entity.world).tracker; // Paper end - tracker.entriesLock.updateLock().lock(); // Akarin + synchronized (tracker.entriesLock) { // Akarin EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId()); if (entry != null) { - tracker.entriesLock.writeLock().lock(); // Akarin entry.clear(getHandle()); - tracker.entriesLock.writeLock().unlock(); // Akarin } - tracker.entriesLock.updateLock().unlock(); // Akarin + } // Akarin // Remove the hidden player from this player user list, if they're on it if (other.sentListPacket) { @@ -1251,14 +1249,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, other)); - tracker.entriesLock.updateLock().lock(); // Akarin + synchronized (tracker.entriesLock) { // Akarin EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId()); if (entry != null && !entry.trackedPlayers.contains(getHandle())) { - tracker.entriesLock.writeLock().lock(); // Akarin entry.updatePlayer(getHandle()); - tracker.entriesLock.writeLock().unlock(); // Akarin } - tracker.entriesLock.updateLock().unlock(); // Akarin + } // Akarin } // Paper start private void reregisterPlayer(EntityPlayer player) { diff --git a/sources/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/sources/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 75c480981..05dfc7c2a 100644 --- a/sources/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/sources/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -38,6 +38,7 @@ import org.bukkit.util.FileUtil; import com.google.common.collect.ImmutableSet; import io.akarin.api.internal.Akari; +import io.akarin.api.internal.utils.ReentrantSpinningLock; /** * Akarin Changes Note @@ -58,6 +59,7 @@ public final class SimplePluginManager implements PluginManager { private final Map> permSubs = new HashMap>(); private final Map> defSubs = new HashMap>(); private boolean useTimings = false; + private final ReentrantSpinningLock pluginLock = new ReentrantSpinningLock(); public SimplePluginManager(Server instance, SimpleCommandMap commandMap) { server = instance;