mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-24 20:42:39 +02:00
Separate worker construction from start
Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
parent
2e523350d3
commit
81553e2816
@ -3,6 +3,7 @@ package net.minestom.server.network.socket;
|
|||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.network.PacketProcessor;
|
import net.minestom.server.network.PacketProcessor;
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
@ -11,7 +12,7 @@ import java.nio.channels.SelectionKey;
|
|||||||
import java.nio.channels.Selector;
|
import java.nio.channels.Selector;
|
||||||
import java.nio.channels.ServerSocketChannel;
|
import java.nio.channels.ServerSocketChannel;
|
||||||
import java.nio.channels.SocketChannel;
|
import java.nio.channels.SocketChannel;
|
||||||
import java.util.ArrayList;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public final class Server {
|
public final class Server {
|
||||||
@ -26,6 +27,7 @@ public final class Server {
|
|||||||
private volatile boolean stop;
|
private volatile boolean stop;
|
||||||
|
|
||||||
private final Selector selector = Selector.open();
|
private final Selector selector = Selector.open();
|
||||||
|
private final PacketProcessor packetProcessor;
|
||||||
private final List<Worker> workers;
|
private final List<Worker> workers;
|
||||||
private int index;
|
private int index;
|
||||||
|
|
||||||
@ -34,14 +36,10 @@ public final class Server {
|
|||||||
private int port;
|
private int port;
|
||||||
|
|
||||||
public Server(PacketProcessor packetProcessor) throws IOException {
|
public Server(PacketProcessor packetProcessor) throws IOException {
|
||||||
// Create all workers
|
this.packetProcessor = packetProcessor;
|
||||||
List<Worker> workers = new ArrayList<>(WORKER_COUNT);
|
Worker[] workers = new Worker[WORKER_COUNT];
|
||||||
for (int i = 0; i < WORKER_COUNT; i++) {
|
Arrays.setAll(workers, value -> new Worker(this));
|
||||||
Worker worker = new Worker(this, packetProcessor);
|
this.workers = List.of(workers);
|
||||||
workers.add(worker);
|
|
||||||
worker.start();
|
|
||||||
}
|
|
||||||
this.workers = List.copyOf(workers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
@ -60,6 +58,7 @@ public final class Server {
|
|||||||
|
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
public void start() {
|
public void start() {
|
||||||
|
this.workers.forEach(Thread::start);
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
while (!stop) {
|
while (!stop) {
|
||||||
// Busy wait for connections
|
// Busy wait for connections
|
||||||
@ -92,6 +91,11 @@ public final class Server {
|
|||||||
this.workers.forEach(worker -> worker.selector.wakeup());
|
this.workers.forEach(worker -> worker.selector.wakeup());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiStatus.Internal
|
||||||
|
public @NotNull PacketProcessor packetProcessor() {
|
||||||
|
return packetProcessor;
|
||||||
|
}
|
||||||
|
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
public List<Worker> workers() {
|
public List<Worker> workers() {
|
||||||
return workers;
|
return workers;
|
||||||
|
@ -3,7 +3,6 @@ package net.minestom.server.network.socket;
|
|||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.entity.Entity;
|
import net.minestom.server.entity.Entity;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.network.PacketProcessor;
|
|
||||||
import net.minestom.server.network.player.PlayerSocketConnection;
|
import net.minestom.server.network.player.PlayerSocketConnection;
|
||||||
import net.minestom.server.thread.MinestomThread;
|
import net.minestom.server.thread.MinestomThread;
|
||||||
import net.minestom.server.utils.binary.BinaryBuffer;
|
import net.minestom.server.utils.binary.BinaryBuffer;
|
||||||
@ -26,18 +25,21 @@ import java.util.zip.Inflater;
|
|||||||
public final class Worker extends MinestomThread {
|
public final class Worker extends MinestomThread {
|
||||||
private static final AtomicInteger COUNTER = new AtomicInteger();
|
private static final AtomicInteger COUNTER = new AtomicInteger();
|
||||||
|
|
||||||
final Selector selector = Selector.open();
|
final Selector selector;
|
||||||
private final Context context = new Context();
|
private final Context context = new Context();
|
||||||
private final Map<SocketChannel, PlayerSocketConnection> connectionMap = new ConcurrentHashMap<>();
|
private final Map<SocketChannel, PlayerSocketConnection> connectionMap = new ConcurrentHashMap<>();
|
||||||
private final Server server;
|
private final Server server;
|
||||||
private final PacketProcessor packetProcessor;
|
|
||||||
private final MpscUnboundedXaddArrayQueue<Runnable> queue = new MpscUnboundedXaddArrayQueue<>(1024);
|
private final MpscUnboundedXaddArrayQueue<Runnable> queue = new MpscUnboundedXaddArrayQueue<>(1024);
|
||||||
private final AtomicBoolean flush = new AtomicBoolean();
|
private final AtomicBoolean flush = new AtomicBoolean();
|
||||||
|
|
||||||
public Worker(Server server, PacketProcessor packetProcessor) throws IOException {
|
Worker(Server server) {
|
||||||
super("Ms-worker-" + COUNTER.getAndIncrement());
|
super("Ms-worker-" + COUNTER.getAndIncrement());
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this.packetProcessor = packetProcessor;
|
try {
|
||||||
|
this.selector = Selector.open();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -69,7 +71,7 @@ public final class Worker extends MinestomThread {
|
|||||||
connection.consumeCache(readBuffer);
|
connection.consumeCache(readBuffer);
|
||||||
// Read & process
|
// Read & process
|
||||||
readBuffer.readChannel(channel);
|
readBuffer.readChannel(channel);
|
||||||
connection.processPackets(context, packetProcessor);
|
connection.processPackets(context, server.packetProcessor());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// TODO print exception? (should ignore disconnection)
|
// TODO print exception? (should ignore disconnection)
|
||||||
connection.disconnect();
|
connection.disconnect();
|
||||||
|
Loading…
Reference in New Issue
Block a user