From 36bcf6972853cf947e5cfe4a58a5af9735756361 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 29 Sep 2021 18:31:28 +0200 Subject: [PATCH] Buffer collection cleaner Signed-off-by: TheMode --- .../player/PlayerSocketConnection.java | 9 +------- .../server/utils/binary/PooledBuffers.java | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java b/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java index 572e98da7..8e9ae8c44 100644 --- a/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java +++ b/src/main/java/net/minestom/server/network/player/PlayerSocketConnection.java @@ -85,6 +85,7 @@ public class PlayerSocketConnection extends PlayerConnection { this.channel = channel; this.remoteAddress = remoteAddress; PooledBuffers.registerBuffer(this, tickBuffer); + PooledBuffers.registerBuffers(this, waitingBuffers); } public void processPackets(Worker.Context workerContext, PacketProcessor packetProcessor) { @@ -342,14 +343,6 @@ public class PlayerSocketConnection extends PlayerConnection { @Override public void disconnect() { - synchronized (bufferLock) { - if (!waitingBuffers.isEmpty()) { - for (BinaryBuffer waitingBuffer : waitingBuffers) { - PooledBuffers.add(waitingBuffer); - } - this.waitingBuffers.clear(); - } - } this.worker.disconnect(this, channel); } diff --git a/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java b/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java index b37fab852..833ca8a9c 100644 --- a/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java +++ b/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.ApiStatus; import java.lang.ref.Cleaner; import java.lang.ref.SoftReference; +import java.util.Collection; import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -47,6 +48,10 @@ public final class PooledBuffers { CLEANER.register(ref, new BufferCleaner(buffer)); } + public static void registerBuffers(Object ref, Collection buffers) { + CLEANER.register(ref, new BuffersCleaner(buffers)); + } + private static final class BufferRefCleaner implements Runnable { private final AtomicReference bufferRef; @@ -72,4 +77,20 @@ public final class PooledBuffers { add(buffer); } } + + private static final class BuffersCleaner implements Runnable { + private final Collection buffers; + + public BuffersCleaner(Collection buffers) { + this.buffers = buffers; + } + + @Override + public void run() { + if (buffers.isEmpty()) return; + for (BinaryBuffer buffer : buffers) { + add(buffer); + } + } + } }