Sync implementation changes for better performance
This commit is contained in:
@@ -16,12 +16,12 @@ public abstract class MixinWorldManager {
|
||||
|
||||
@Overwrite
|
||||
public void a(Entity entity) {
|
||||
synchronized (this.world.getTracker().entriesLock) { // Akarin
|
||||
this.world.getTracker().entriesLock.writeLock().lock(); // Akarin
|
||||
this.world.getTracker().track(entity);
|
||||
} // Akarin
|
||||
this.world.getTracker().entriesLock.writeLock().unlock(); // Akarin
|
||||
|
||||
if (entity instanceof EntityPlayer) {
|
||||
this.world.worldProvider.a((EntityPlayer) entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -761,9 +761,9 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||||
if (entity instanceof EntityPlayer) {
|
||||
WorldServer worldServer = (WorldServer) entity.getWorld();
|
||||
worldServer.tracker.untrackEntity(this);
|
||||
synchronized (worldServer.tracker.entriesLock) { // Akarin
|
||||
worldServer.tracker.entriesLock.writeLock().lock(); // Akarin
|
||||
worldServer.tracker.track(this);
|
||||
} // Akarin
|
||||
worldServer.tracker.entriesLock.writeLock().unlock(); // Akarin
|
||||
}
|
||||
// Paper end
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ public class EntityTracker {
|
||||
private static final Logger a = LogManager.getLogger();
|
||||
private final WorldServer world;
|
||||
private final Set<EntityTrackerEntry> c = Sets.newHashSet();
|
||||
public final Object entriesLock = new Object(); // Akarin - add lock
|
||||
public final ReentrantReadWriteUpdateLock entriesLock = new ReentrantReadWriteUpdateLock(); // Akarin - add lock
|
||||
public final IntHashMap<EntityTrackerEntry> 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
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.writeLock().lock(); // Akarin
|
||||
if (entity instanceof EntityPlayer) {
|
||||
EntityPlayer entityplayer = (EntityPlayer) entity;
|
||||
Iterator iterator = this.c.iterator();
|
||||
@@ -179,14 +179,14 @@ public class EntityTracker {
|
||||
entitytrackerentry1.a();
|
||||
}
|
||||
|
||||
} // Akarin
|
||||
entriesLock.writeLock().unlock(); // Akarin
|
||||
}
|
||||
|
||||
public void updatePlayers() {
|
||||
ArrayList arraylist = Lists.newArrayList();
|
||||
Iterator iterator = this.c.iterator();
|
||||
world.timings.tracker1.startTiming(); // Spigot
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.writeLock().lock(); // Akarin
|
||||
while (iterator.hasNext()) {
|
||||
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
|
||||
|
||||
@@ -214,14 +214,14 @@ public class EntityTracker {
|
||||
}
|
||||
}
|
||||
}
|
||||
} // Akarin
|
||||
entriesLock.writeLock().unlock(); // Akarin
|
||||
world.timings.tracker2.stopTiming(); // Spigot
|
||||
|
||||
}
|
||||
|
||||
public void a(EntityPlayer entityplayer) {
|
||||
Iterator iterator = this.c.iterator();
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.writeLock().lock(); // Akarin
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
|
||||
@@ -233,34 +233,34 @@ public class EntityTracker {
|
||||
}
|
||||
}
|
||||
|
||||
} // Akarin
|
||||
entriesLock.writeLock().unlock(); // Akarin
|
||||
}
|
||||
|
||||
public void a(Entity entity, Packet<?> packet) {
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.readLock().lock(); // 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) {
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.readLock().lock(); // 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();
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.writeLock().lock(); // Akarin
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
|
||||
@@ -268,14 +268,14 @@ public class EntityTracker {
|
||||
entitytrackerentry.clear(entityplayer);
|
||||
}
|
||||
|
||||
} // Akarin
|
||||
entriesLock.writeLock().unlock(); // Akarin
|
||||
}
|
||||
|
||||
public void a(EntityPlayer entityplayer, Chunk chunk) {
|
||||
ArrayList arraylist = Lists.newArrayList();
|
||||
ArrayList arraylist1 = Lists.newArrayList();
|
||||
Iterator iterator = this.c.iterator();
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.writeLock().lock(); // Akarin
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
|
||||
@@ -292,7 +292,7 @@ public class EntityTracker {
|
||||
}
|
||||
}
|
||||
}
|
||||
} // Akarin
|
||||
entriesLock.writeLock().unlock(); // 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();
|
||||
synchronized (entriesLock) { // Akarin
|
||||
entriesLock.readLock().lock(); // Akarin
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
|
||||
@@ -327,6 +327,6 @@ public class EntityTracker {
|
||||
entitytrackerentry.a(this.e);
|
||||
}
|
||||
|
||||
} // Akarin
|
||||
entriesLock.readLock().unlock(); // Akarin
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,8 @@ import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
@@ -129,7 +131,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||
private boolean hasPlayedBefore = false;
|
||||
private final ConversationTracker conversationTracker = new ConversationTracker();
|
||||
private final Set<String> channels = new HashSet<String>();
|
||||
private final Map<UUID, Set<WeakReference<Plugin>>> hiddenPlayers = Maps.newConcurrentMap(); // new HashMap<>(); // Akarin
|
||||
private final Map<UUID, Set<WeakReference<Plugin>>> hiddenPlayers = Collections.synchronizedMap(new HashMap<>()); // Akarin
|
||||
private static final WeakHashMap<Plugin, WeakReference<Plugin>> pluginWeakReferences = new WeakHashMap<>();
|
||||
private int hash = 0;
|
||||
private double health = 20;
|
||||
@@ -1197,12 +1199,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||
EntityTracker tracker = ((WorldServer) entity.world).tracker;
|
||||
// Paper end
|
||||
|
||||
synchronized (tracker.entriesLock) { // Akarin
|
||||
tracker.entriesLock.updateLock().lock(); // Akarin
|
||||
EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId());
|
||||
if (entry != null) {
|
||||
tracker.entriesLock.writeLock().lock(); // Akarin
|
||||
entry.clear(getHandle());
|
||||
tracker.entriesLock.writeLock().unlock(); // Akarin
|
||||
}
|
||||
} // Akarin
|
||||
tracker.entriesLock.updateLock().unlock(); // Akarin
|
||||
|
||||
// Remove the hidden player from this player user list, if they're on it
|
||||
if (other.sentListPacket) {
|
||||
@@ -1249,12 +1253,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||
|
||||
getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, other));
|
||||
|
||||
synchronized (tracker.entriesLock) { // Akarin
|
||||
tracker.entriesLock.updateLock().lock(); // 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
|
||||
}
|
||||
} // Akarin
|
||||
tracker.entriesLock.updateLock().unlock(); // Akarin
|
||||
}
|
||||
// Paper start
|
||||
private void reregisterPlayer(EntityPlayer player) {
|
||||
@@ -1994,4 +2000,4 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||
return spigot;
|
||||
}
|
||||
// Spigot end
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,6 @@ 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
|
||||
@@ -59,7 +58,6 @@ public final class SimplePluginManager implements PluginManager {
|
||||
private final Map<String, Map<Permissible, Boolean>> permSubs = new HashMap<String, Map<Permissible, Boolean>>();
|
||||
private final Map<Boolean, Map<Permissible, Boolean>> defSubs = new HashMap<Boolean, Map<Permissible, Boolean>>();
|
||||
private boolean useTimings = false;
|
||||
private final ReentrantSpinningLock pluginLock = new ReentrantSpinningLock();
|
||||
|
||||
public SimplePluginManager(Server instance, SimpleCommandMap commandMap) {
|
||||
server = instance;
|
||||
|
||||
Reference in New Issue
Block a user