Optimize PooledBuffers

Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
TheMode 2021-11-21 13:15:29 +01:00
parent 81553e2816
commit 098885cc7f

View File

@ -1,35 +1,32 @@
package net.minestom.server.utils.binary;
import org.jctools.queues.MessagePassingQueue;
import org.jctools.queues.MpmcUnboundedXaddArrayQueue;
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;
import java.util.concurrent.atomic.AtomicReference;
@ApiStatus.Internal
@ApiStatus.Experimental
public final class PooledBuffers {
private final static Queue<SoftReference<BinaryBuffer>> POOLED_BUFFERS = new ConcurrentLinkedQueue<>();
private final static MessagePassingQueue<SoftReference<BinaryBuffer>> POOLED_BUFFERS = new MpmcUnboundedXaddArrayQueue<>(1024);
private final static int BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143);
private final static Cleaner CLEANER = Cleaner.create();
public static BinaryBuffer get() {
BinaryBuffer buffer = null;
BinaryBuffer buffer;
SoftReference<BinaryBuffer> ref;
while ((ref = POOLED_BUFFERS.poll()) != null) {
buffer = ref.get();
if (buffer != null) break;
while ((ref = POOLED_BUFFERS.relaxedPoll()) != null) {
if ((buffer = ref.get()) != null) return buffer;
}
return Objects.requireNonNullElseGet(buffer, () -> BinaryBuffer.ofSize(BUFFER_SIZE));
return BinaryBuffer.ofSize(BUFFER_SIZE);
}
public static void add(BinaryBuffer buffer) {
buffer.clear();
POOLED_BUFFERS.add(new SoftReference<>(buffer));
POOLED_BUFFERS.relaxedOffer(new SoftReference<>(buffer.clear()));
}
public static int count() {