diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index 09291b22ab6..a861245b5c2 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -31,6 +31,7 @@ import mage.target.TargetAmount; import mage.target.TargetCard; import mage.util.CardUtil; import mage.util.RandomUtil; +import mage.util.ThreadUtils; import org.apache.log4j.Logger; import java.util.*; @@ -61,7 +62,7 @@ public class ComputerPlayer6 extends ComputerPlayer { new LinkedBlockingQueue<>(), r -> { Thread thread = new Thread(r); - thread.setName("AI-SIM-" + thread.getId()); + thread.setName(ThreadUtils.THREAD_PREFIX_AI_SIMULATION + "-" + thread.getId()); return thread; }); protected int maxDepth; diff --git a/Mage.Server/src/main/java/mage/server/draft/DraftController.java b/Mage.Server/src/main/java/mage/server/draft/DraftController.java index 38af257d528..360ce8c8cf8 100644 --- a/Mage.Server/src/main/java/mage/server/draft/DraftController.java +++ b/Mage.Server/src/main/java/mage/server/draft/DraftController.java @@ -9,6 +9,7 @@ import mage.game.events.TableEvent; import mage.players.Player; import mage.server.game.GameController; import mage.server.managers.ManagerFactory; +import mage.util.ThreadUtils; import mage.view.DraftPickView; import org.apache.log4j.Logger; @@ -124,7 +125,7 @@ public class DraftController { } private void startDraft() { - Thread.currentThread().setName("TOURNEY DRAFT " + tableId); + Thread.currentThread().setName(ThreadUtils.THREAD_PREFIX_TOURNEY_DRAFT + " " + tableId); for (final Entry entry : draftSessions.entrySet()) { if (!entry.getValue().init()) { logger.fatal("Unable to initialize client for playerId " + entry.getKey()); diff --git a/Mage.Server/src/main/java/mage/server/game/GameWorker.java b/Mage.Server/src/main/java/mage/server/game/GameWorker.java index 169fad24673..a4bee3b947c 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameWorker.java +++ b/Mage.Server/src/main/java/mage/server/game/GameWorker.java @@ -2,6 +2,7 @@ package mage.server.game; import mage.MageException; import mage.game.Game; +import mage.util.ThreadUtils; import org.apache.log4j.Logger; import java.util.UUID; @@ -30,7 +31,7 @@ public class GameWorker implements Callable { public Boolean call() { try { // play game - Thread.currentThread().setName("GAME " + game.getId()); + Thread.currentThread().setName(ThreadUtils.THREAD_PREFIX_GAME + " " + game.getId()); game.start(choosingPlayerId); // save result and start next game or close finished table diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java index 4e914513102..87e5f809b7a 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java @@ -23,6 +23,7 @@ import mage.server.User; import mage.server.draft.DraftController; import mage.server.managers.TableManager; import mage.server.managers.ManagerFactory; +import mage.util.ThreadUtils; import mage.view.ChatMessage.MessageColor; import mage.view.ChatMessage.MessageType; import mage.view.ChatMessage.SoundToPlay; @@ -191,7 +192,7 @@ public class TournamentController { } private synchronized void startTournament() { - Thread.currentThread().setName("TOURNEY " + tableId); + Thread.currentThread().setName(ThreadUtils.THREAD_PREFIX_TOURNEY + " " + tableId); for (final TournamentSession tournamentSession : tournamentSessions.values()) { if (!tournamentSession.init()) { logger.fatal("Unable to initialize client userId: " + tournamentSession.userId + " tournamentId " + tournament.getId()); diff --git a/Mage.Server/src/main/java/mage/server/util/ThreadExecutorImpl.java b/Mage.Server/src/main/java/mage/server/util/ThreadExecutorImpl.java index a3e8e1a3427..e5f692afc46 100644 --- a/Mage.Server/src/main/java/mage/server/util/ThreadExecutorImpl.java +++ b/Mage.Server/src/main/java/mage/server/util/ThreadExecutorImpl.java @@ -41,31 +41,31 @@ public class ThreadExecutorImpl implements ThreadExecutor { callExecutor = new CachedThreadPoolWithException(); ((ThreadPoolExecutor) callExecutor).setKeepAliveTime(60, TimeUnit.SECONDS); ((ThreadPoolExecutor) callExecutor).allowCoreThreadTimeOut(true); - ((ThreadPoolExecutor) callExecutor).setThreadFactory(new XMageThreadFactory("CALL")); + ((ThreadPoolExecutor) callExecutor).setThreadFactory(new XMageThreadFactory(ThreadUtils.THREAD_PREFIX_CALL_REQUEST)); //gameExecutor = Executors.newFixedThreadPool(config.getMaxGameThreads()); gameExecutor = new FixedThreadPoolWithException(config.getMaxGameThreads()); ((ThreadPoolExecutor) gameExecutor).setKeepAliveTime(60, TimeUnit.SECONDS); ((ThreadPoolExecutor) gameExecutor).allowCoreThreadTimeOut(true); - ((ThreadPoolExecutor) gameExecutor).setThreadFactory(new XMageThreadFactory("GAME")); + ((ThreadPoolExecutor) gameExecutor).setThreadFactory(new XMageThreadFactory(ThreadUtils.THREAD_PREFIX_GAME)); //tourney = Executors.newFixedThreadPool(config.getMaxGameThreads() / GAMES_PER_TOURNEY_RATIO); tourneyExecutor = new FixedThreadPoolWithException(config.getMaxGameThreads() / GAMES_PER_TOURNEY_RATIO); ((ThreadPoolExecutor) tourneyExecutor).setKeepAliveTime(60, TimeUnit.SECONDS); ((ThreadPoolExecutor) tourneyExecutor).allowCoreThreadTimeOut(true); - ((ThreadPoolExecutor) tourneyExecutor).setThreadFactory(new XMageThreadFactory("TOURNEY")); + ((ThreadPoolExecutor) tourneyExecutor).setThreadFactory(new XMageThreadFactory(ThreadUtils.THREAD_PREFIX_TOURNEY)); timeoutExecutor = Executors.newScheduledThreadPool(4); ((ThreadPoolExecutor) timeoutExecutor).setKeepAliveTime(60, TimeUnit.SECONDS); ((ThreadPoolExecutor) timeoutExecutor).allowCoreThreadTimeOut(true); - ((ThreadPoolExecutor) timeoutExecutor).setThreadFactory(new XMageThreadFactory("XMAGE TIMEOUT")); + ((ThreadPoolExecutor) timeoutExecutor).setThreadFactory(new XMageThreadFactory(ThreadUtils.THREAD_PREFIX_TIMEOUT)); timeoutIdleExecutor = Executors.newScheduledThreadPool(4); ((ThreadPoolExecutor) timeoutIdleExecutor).setKeepAliveTime(60, TimeUnit.SECONDS); ((ThreadPoolExecutor) timeoutIdleExecutor).allowCoreThreadTimeOut(true); - ((ThreadPoolExecutor) timeoutIdleExecutor).setThreadFactory(new XMageThreadFactory("XMAGE TIMEOUT_IDLE")); + ((ThreadPoolExecutor) timeoutIdleExecutor).setThreadFactory(new XMageThreadFactory(ThreadUtils.THREAD_PREFIX_TIMEOUT_IDLE)); - serverHealthExecutor = Executors.newSingleThreadScheduledExecutor(new XMageThreadFactory("HEALTH")); + serverHealthExecutor = Executors.newSingleThreadScheduledExecutor(new XMageThreadFactory(ThreadUtils.THREAD_PREFIX_SERVICE_HEALTH)); } static class CachedThreadPoolWithException extends ThreadPoolExecutor { @@ -157,7 +157,8 @@ class XMageThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); - thread.setName(prefix + ' ' + thread.getThreadGroup().getName() + '-' + thread.getId()); + // default name, but threads can change it (example: on game or tourney start) + thread.setName(prefix + " " + thread.getThreadGroup().getName() + "-" + thread.getId()); return thread; } } diff --git a/Mage/src/main/java/mage/util/ThreadUtils.java b/Mage/src/main/java/mage/util/ThreadUtils.java index e568aa7cb8a..b0c0560c8fa 100644 --- a/Mage/src/main/java/mage/util/ThreadUtils.java +++ b/Mage/src/main/java/mage/util/ThreadUtils.java @@ -14,6 +14,23 @@ import java.util.concurrent.Future; */ public final class ThreadUtils { + // basic + public final static String THREAD_PREFIX_GAME = "GAME"; + public final static String THREAD_PREFIX_AI_SIMULATION = "AI-SIM"; + public final static String THREAD_PREFIX_CALL_REQUEST = "CALL"; + public final static String THREAD_PREFIX_TOURNEY = "TOURNEY"; + public final static String THREAD_PREFIX_TOURNEY_DRAFT = "TOURNEY DRAFT"; + + // services + public final static String THREAD_PREFIX_SERVICE_HEALTH = "XMAGE HEALTH"; + + // etc + public final static String THREAD_PREFIX_TIMEOUT = "XMAGE TIMEOUT"; + public final static String THREAD_PREFIX_TIMEOUT_IDLE = "XMAGE TIMEOUT_IDLE"; + + + + public static void sleep(int millis) { try { Thread.sleep(millis); @@ -68,9 +85,12 @@ public final class ThreadUtils { public static boolean isRunGameThread() { String name = Thread.currentThread().getName(); - if (name.startsWith("GAME ")) { + if (name.startsWith(THREAD_PREFIX_GAME)) { // server game return true; + } else if (name.startsWith(THREAD_PREFIX_AI_SIMULATION)) { + // ai simulation + return true; } else if (name.equals("main")) { // unit test return true; @@ -81,7 +101,7 @@ public final class ThreadUtils { public static void ensureRunInCallThread() { String name = Thread.currentThread().getName(); - if (!name.startsWith("CALL")) { + if (!name.startsWith(THREAD_PREFIX_CALL_REQUEST)) { // how-to fix: something wrong in your code logic throw new IllegalArgumentException("Wrong code usage: client commands code must run in CALL threads, but used in " + name, new Throwable()); }