diff --git a/src/main/java/net/minecraft/network/rcon/RConThreadClient.java b/src/main/java/net/minecraft/network/rcon/RConThreadClient.java index 4a46c4b..9d583c6 100644 --- a/src/main/java/net/minecraft/network/rcon/RConThreadClient.java +++ b/src/main/java/net/minecraft/network/rcon/RConThreadClient.java @@ -15,7 +15,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.server.ConfigurationHandler; -import org.ultramine.server.RconCommandQueue; +import org.ultramine.server.internal.RСonCommandRequest; +import org.ultramine.server.util.GlobalExecutors; @SideOnly(Side.SERVER) public class RConThreadClient extends RConThreadBase @@ -98,7 +99,7 @@ try { - this.sendMultipacketResponse(k, RconCommandQueue.instance().request(s1).await()); + this.sendMultipacketResponse(k, GlobalExecutors.nextTick().await(new RСonCommandRequest(s1))); } catch (Exception exception) { diff --git a/src/main/java/org/ultramine/server/RconCommandQueue.java b/src/main/java/org/ultramine/server/RconCommandQueue.java deleted file mode 100644 index 6be4bca..0000000 --- a/src/main/java/org/ultramine/server/RconCommandQueue.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.ultramine.server; - -import java.util.Queue; - -import com.google.common.collect.Queues; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.server.MinecraftServer; - -@SideOnly(Side.SERVER) -public class RconCommandQueue -{ - private static final RconCommandQueue INSTANCE = new RconCommandQueue(); - public static RconCommandQueue instance() - { - return INSTANCE; - } - - private final Queue queue = Queues.newConcurrentLinkedQueue(); - private final MinecraftServer server = MinecraftServer.getServer(); - - private RconCommandQueue() - { - FMLCommonHandler.instance().bus().register(this); - } - - @SubscribeEvent - public void onTick(TickEvent.ServerTickEvent e) - { - if(e.phase == TickEvent.Phase.END) - { - for(CommandRequest command; (command = queue.poll()) != null;) - { - command.result = server.handleRConCommand(command.cmd); - synchronized(command) - { - command.notifyAll(); - } - } - } - } - - public CommandRequest request(String cmd) - { - CommandRequest command = new CommandRequest(cmd); - queue.add(command); - return command; - } - - @SideOnly(Side.SERVER) - public static class CommandRequest - { - private final String cmd; - private volatile String result = null; - - private CommandRequest(String cmd) - { - this.cmd = cmd; - } - - public String await() - { - while(result == null) - synchronized(this){try{this.wait();}catch(InterruptedException e){}} - return result; - } - } -} diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 53b36cc..2086798 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -132,7 +132,7 @@ { if(e.getSide().isServer()) ConfigurationHandler.saveServerConfig(); - ((SyncServerExecutor)GlobalExecutors.nextTick()).register(); + (GlobalExecutors.nextTick()).register(); } catch (Throwable t) { diff --git "a/src/main/java/org/ultramine/server/internal/R\320\241onCommandRequest.java" "b/src/main/java/org/ultramine/server/internal/R\320\241onCommandRequest.java" new file mode 100644 index 0000000..8ce0bd6 --- /dev/null +++ "b/src/main/java/org/ultramine/server/internal/R\320\241onCommandRequest.java" @@ -0,0 +1,21 @@ +package org.ultramine.server.internal; + +import net.minecraft.server.MinecraftServer; + +import java.util.function.Supplier; + +public class RСonCommandRequest implements Supplier +{ + private final String command; + + public RСonCommandRequest(String command) + { + this.command = command; + } + + @Override + public String get() + { + return MinecraftServer.getServer().handleRConCommand(command); + } +} diff --git a/src/main/java/org/ultramine/server/util/GlobalExecutors.java b/src/main/java/org/ultramine/server/util/GlobalExecutors.java index 993b38d..613bd08 100644 --- a/src/main/java/org/ultramine/server/util/GlobalExecutors.java +++ b/src/main/java/org/ultramine/server/util/GlobalExecutors.java @@ -17,7 +17,7 @@ 60L, TimeUnit.SECONDS, new SynchronousQueue(), new ThreadFactoryBuilder().setNameFormat("UM IO cached #%d").setDaemon(true).build()); - private static final Executor sync = new SyncServerExecutor(); + private static final SyncServerExecutor sync = new SyncServerExecutor(); /** * Обрабатывает задачи на сохранение чего-либо на диск/в БД. Используется @@ -54,7 +54,7 @@ /** * Выполняет задачи в основном потоке сервера, на следующем тике */ - public static Executor nextTick() + public static SyncServerExecutor nextTick() { return sync; } diff --git a/src/main/java/org/ultramine/server/util/SyncServerExecutor.java b/src/main/java/org/ultramine/server/util/SyncServerExecutor.java index 11a9dd1..3acf99d 100644 --- a/src/main/java/org/ultramine/server/util/SyncServerExecutor.java +++ b/src/main/java/org/ultramine/server/util/SyncServerExecutor.java @@ -1,7 +1,9 @@ package org.ultramine.server.util; import java.util.Queue; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import java.util.function.Supplier; import com.google.common.collect.Queues; @@ -22,12 +24,6 @@ { FMLCommonHandler.instance().bus().unregister(this); } - - @Override - public void execute(Runnable toRun) - { - queue.add(toRun); - } @SubscribeEvent public void onServerTick(TickEvent.ServerTickEvent e) @@ -38,4 +34,30 @@ toRun.run(); } } + + @Override + public void execute(Runnable toRun) + { + queue.add(toRun); + } + + public CompletableFuture completable(Runnable toRun) + { + return CompletableFuture.runAsync(toRun, this); + } + + public void await(Runnable toRun) + { + completable(toRun).join(); + } + + public CompletableFuture completable(Supplier supplier) + { + return CompletableFuture.supplyAsync(supplier, this); + } + + public T await(Supplier supplier) + { + return completable(supplier).join(); + } }