Separate worker construction from start

Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
TheMode 2021-11-21 12:51:13 +01:00
parent 2e523350d3
commit 81553e2816
2 changed files with 21 additions and 15 deletions

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.socket;
import net.minestom.server.MinecraftServer;
import net.minestom.server.network.PacketProcessor;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.net.InetSocketAddress;
@ -11,7 +12,7 @@ import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public final class Server {
@ -26,6 +27,7 @@ public final class Server {
private volatile boolean stop;
private final Selector selector = Selector.open();
private final PacketProcessor packetProcessor;
private final List<Worker> workers;
private int index;
@ -34,14 +36,10 @@ public final class Server {
private int port;
public Server(PacketProcessor packetProcessor) throws IOException {
// Create all workers
List<Worker> workers = new ArrayList<>(WORKER_COUNT);
for (int i = 0; i < WORKER_COUNT; i++) {
Worker worker = new Worker(this, packetProcessor);
workers.add(worker);
worker.start();
}
this.workers = List.copyOf(workers);
this.packetProcessor = packetProcessor;
Worker[] workers = new Worker[WORKER_COUNT];
Arrays.setAll(workers, value -> new Worker(this));
this.workers = List.of(workers);
}
@ApiStatus.Internal
@ -60,6 +58,7 @@ public final class Server {
@ApiStatus.Internal
public void start() {
this.workers.forEach(Thread::start);
new Thread(() -> {
while (!stop) {
// Busy wait for connections
@ -92,6 +91,11 @@ public final class Server {
this.workers.forEach(worker -> worker.selector.wakeup());
}
@ApiStatus.Internal
public @NotNull PacketProcessor packetProcessor() {
return packetProcessor;
}
@ApiStatus.Internal
public List<Worker> workers() {
return workers;

View File

@ -3,7 +3,6 @@ package net.minestom.server.network.socket;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Player;
import net.minestom.server.network.PacketProcessor;
import net.minestom.server.network.player.PlayerSocketConnection;
import net.minestom.server.thread.MinestomThread;
import net.minestom.server.utils.binary.BinaryBuffer;
@ -26,18 +25,21 @@ import java.util.zip.Inflater;
public final class Worker extends MinestomThread {
private static final AtomicInteger COUNTER = new AtomicInteger();
final Selector selector = Selector.open();
final Selector selector;
private final Context context = new Context();
private final Map<SocketChannel, PlayerSocketConnection> connectionMap = new ConcurrentHashMap<>();
private final Server server;
private final PacketProcessor packetProcessor;
private final MpscUnboundedXaddArrayQueue<Runnable> queue = new MpscUnboundedXaddArrayQueue<>(1024);
private final AtomicBoolean flush = new AtomicBoolean();
public Worker(Server server, PacketProcessor packetProcessor) throws IOException {
Worker(Server server) {
super("Ms-worker-" + COUNTER.getAndIncrement());
this.server = server;
this.packetProcessor = packetProcessor;
try {
this.selector = Selector.open();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
@ -69,7 +71,7 @@ public final class Worker extends MinestomThread {
connection.consumeCache(readBuffer);
// Read & process
readBuffer.readChannel(channel);
connection.processPackets(context, packetProcessor);
connection.processPackets(context, server.packetProcessor());
} catch (IOException e) {
// TODO print exception? (should ignore disconnection)
connection.disconnect();