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

@@ -33,7 +33,7 @@
* 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.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.ObjectOutputStream;

View File

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

View File

@@ -1,8 +1,9 @@
package net.minecraft.server;
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.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
@@ -75,7 +76,7 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
};
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 ReentrantReadWriteLock j = new ReentrantReadWriteLock();
private final ReentrantReadWriteUpdateLock j = new ReentrantReadWriteUpdateLock(); // Akarin - use update lock
public Channel channel;
// Spigot Start // PAIL
public SocketAddress l;