Update locks - resolves GH-25
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user