mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-24 20:42:39 +02:00
Optimize PooledBuffers
Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
parent
81553e2816
commit
098885cc7f
@ -1,35 +1,32 @@
|
|||||||
package net.minestom.server.utils.binary;
|
package net.minestom.server.utils.binary;
|
||||||
|
|
||||||
|
import org.jctools.queues.MessagePassingQueue;
|
||||||
|
import org.jctools.queues.MpmcUnboundedXaddArrayQueue;
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
|
||||||
import java.lang.ref.Cleaner;
|
import java.lang.ref.Cleaner;
|
||||||
import java.lang.ref.SoftReference;
|
import java.lang.ref.SoftReference;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
@ApiStatus.Experimental
|
@ApiStatus.Experimental
|
||||||
public final class PooledBuffers {
|
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 int BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143);
|
||||||
private final static Cleaner CLEANER = Cleaner.create();
|
private final static Cleaner CLEANER = Cleaner.create();
|
||||||
|
|
||||||
public static BinaryBuffer get() {
|
public static BinaryBuffer get() {
|
||||||
BinaryBuffer buffer = null;
|
BinaryBuffer buffer;
|
||||||
SoftReference<BinaryBuffer> ref;
|
SoftReference<BinaryBuffer> ref;
|
||||||
while ((ref = POOLED_BUFFERS.poll()) != null) {
|
while ((ref = POOLED_BUFFERS.relaxedPoll()) != null) {
|
||||||
buffer = ref.get();
|
if ((buffer = ref.get()) != null) return buffer;
|
||||||
if (buffer != null) break;
|
|
||||||
}
|
}
|
||||||
return Objects.requireNonNullElseGet(buffer, () -> BinaryBuffer.ofSize(BUFFER_SIZE));
|
return BinaryBuffer.ofSize(BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void add(BinaryBuffer buffer) {
|
public static void add(BinaryBuffer buffer) {
|
||||||
buffer.clear();
|
POOLED_BUFFERS.relaxedOffer(new SoftReference<>(buffer.clear()));
|
||||||
POOLED_BUFFERS.add(new SoftReference<>(buffer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int count() {
|
public static int count() {
|
||||||
|
Loading…
Reference in New Issue
Block a user