Update locks - resolves GH-25

This commit is contained in:
Sotr
2018-07-14 03:05:59 +08:00
parent ca8e0d7c0f
commit 3875266bb7
5 changed files with 16 additions and 10 deletions

View File

@@ -133,6 +133,11 @@
<artifactId>mixin</artifactId> <artifactId>mixin</artifactId>
<version>0.7.10-SNAPSHOT</version> <version>0.7.10-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>com.googlecode.concurrent-locks</groupId>
<artifactId>concurrent-locks</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies> </dependencies>
<repositories> <repositories>

View File

@@ -33,7 +33,7 @@
* at http://creativecommons.org/publicdomain/zero/1.0/ * at http://creativecommons.org/publicdomain/zero/1.0/
*/ */
package io.akarin.api.internal.collections; package io.akarin.api.internal.utils;
import java.util.AbstractQueue; import java.util.AbstractQueue;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,4 +1,4 @@
package io.akarin.api.internal.collections; package io.akarin.api.internal.utils;
import java.io.Serializable; import java.io.Serializable;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;

View File

@@ -1,14 +1,14 @@
package io.akarin.server.mixin.nsc; package io.akarin.server.mixin.nsc;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import io.akarin.api.internal.collections.CheckedConcurrentLinkedQueue; import com.googlecode.concurentlocks.ReentrantReadWriteUpdateLock;
import io.akarin.api.internal.utils.CheckedConcurrentLinkedQueue;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.netty.util.concurrent.Future; import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener; import io.netty.util.concurrent.GenericFutureListener;
@@ -21,7 +21,7 @@ import net.minecraft.server.PacketPlayOutMapChunk;
public abstract class OptimisticNetworkManager { public abstract class OptimisticNetworkManager {
@Shadow public Channel channel; @Shadow public Channel channel;
@Shadow(aliases = "i") @Final private Queue<NetworkManager.QueuedPacket> packets; @Shadow(aliases = "i") @Final private Queue<NetworkManager.QueuedPacket> packets;
@Shadow(aliases = "j") @Final private ReentrantReadWriteLock queueLock; @Shadow(aliases = "j") @Final private ReentrantReadWriteUpdateLock queueLock;
@Shadow public abstract Queue<NetworkManager.QueuedPacket> getPacketQueue(); @Shadow public abstract Queue<NetworkManager.QueuedPacket> getPacketQueue();
@Shadow public abstract void dispatchPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>>[] genericFutureListeners); @Shadow public abstract void dispatchPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>>[] genericFutureListeners);
@@ -36,7 +36,7 @@ public abstract class OptimisticNetworkManager {
return true; return true;
} }
this.queueLock.readLock().lock(); this.queueLock.updateLock().lock();
try { try {
while (!this.packets.isEmpty()) { while (!this.packets.isEmpty()) {
NetworkManager.QueuedPacket packet = ((CheckedConcurrentLinkedQueue<QueuedPacket>) getPacketQueue()).poll(item -> { NetworkManager.QueuedPacket packet = ((CheckedConcurrentLinkedQueue<QueuedPacket>) getPacketQueue()).poll(item -> {
@@ -52,7 +52,7 @@ public abstract class OptimisticNetworkManager {
} }
} }
} finally { } finally {
this.queueLock.readLock().unlock(); this.queueLock.updateLock().unlock();
} }
} }

View File

@@ -1,8 +1,9 @@
package net.minecraft.server; package net.minecraft.server;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.googlecode.concurentlocks.ReentrantReadWriteUpdateLock;
import io.akarin.api.internal.collections.CheckedConcurrentLinkedQueue; import io.akarin.api.internal.utils.CheckedConcurrentLinkedQueue;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
@@ -75,7 +76,7 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
}; };
private final EnumProtocolDirection h; private final EnumProtocolDirection h;
private final Queue<NetworkManager.QueuedPacket> i = new CheckedConcurrentLinkedQueue<NetworkManager.QueuedPacket>(); private final Queue<NetworkManager.QueuedPacket> getPacketQueue() { return this.i; } // Paper - Anti-Xray - OBFHELPER // Akarin private final Queue<NetworkManager.QueuedPacket> i = new CheckedConcurrentLinkedQueue<NetworkManager.QueuedPacket>(); private final Queue<NetworkManager.QueuedPacket> getPacketQueue() { return this.i; } // Paper - Anti-Xray - OBFHELPER // Akarin
private final ReentrantReadWriteLock j = new ReentrantReadWriteLock(); private final ReentrantReadWriteUpdateLock j = new ReentrantReadWriteUpdateLock(); // Akarin - use update lock
public Channel channel; public Channel channel;
// Spigot Start // PAIL // Spigot Start // PAIL
public SocketAddress l; public SocketAddress l;