From 2a44572fb2dc7a74307a1b90c48958978245b4c7 Mon Sep 17 00:00:00 2001 From: Luck Date: Sat, 16 Jan 2021 18:24:10 +0000 Subject: [PATCH] Fix non-daemon command manager thread sometimes preventing shutdown --- .../luckperms/common/command/CommandManager.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/me/lucko/luckperms/common/command/CommandManager.java b/common/src/main/java/me/lucko/luckperms/common/command/CommandManager.java index f2f82913d..f0cec28b8 100644 --- a/common/src/main/java/me/lucko/luckperms/common/command/CommandManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/command/CommandManager.java @@ -72,8 +72,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Function; import java.util.stream.Collectors; @@ -83,16 +82,13 @@ import java.util.stream.Collectors; public class CommandManager { private final LuckPermsPlugin plugin; - - // the default executor to run commands on - private final ExecutorService executor = Executors.newSingleThreadExecutor(); - + private final ReentrantLock lock; private final TabCompletions tabCompletions; - private final Map> mainCommands; public CommandManager(LuckPermsPlugin plugin) { this.plugin = plugin; + this.lock = new ReentrantLock(true); // enable fairness this.tabCompletions = new TabCompletions(plugin); this.mainCommands = ImmutableList.>builder() .add(new UserParentCommand()) @@ -134,13 +130,16 @@ public class CommandManager { public CompletableFuture executeCommand(Sender sender, String label, List args) { return CompletableFuture.supplyAsync(() -> { + this.lock.lock(); try { return execute(sender, label, args); } catch (Throwable e) { this.plugin.getLogger().severe("Exception whilst executing command: " + args, e); return null; + } finally { + this.lock.unlock(); } - }, this.executor); + }, this.plugin.getBootstrap().getScheduler().async()); } public boolean hasPermissionForAny(Sender sender) {