diff --git a/L2J_Mobius_01.0_Ertheia/dist/login/config/LoginServer.ini b/L2J_Mobius_01.0_Ertheia/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_01.0_Ertheia/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java index 10644892f8..6224be1d7e 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java @@ -3573,6 +3573,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_02.5_Underground/dist/login/config/LoginServer.ini b/L2J_Mobius_02.5_Underground/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_02.5_Underground/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_02.5_Underground/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java index f2bdbef08a..4f608e0aea 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java @@ -3599,6 +3599,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_03.0_Helios/dist/login/config/LoginServer.ini b/L2J_Mobius_03.0_Helios/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_03.0_Helios/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_03.0_Helios/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java index 91fb8d11a8..ae7532c867 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java @@ -3621,6 +3621,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/login/config/LoginServer.ini b/L2J_Mobius_04.0_GrandCrusade/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_04.0_GrandCrusade/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java index b729cf2a83..314d868937 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java @@ -3595,6 +3595,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_05.0_Salvation/dist/login/config/LoginServer.ini b/L2J_Mobius_05.0_Salvation/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_05.0_Salvation/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_05.0_Salvation/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java index bfaf6668c8..1562e95702 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java @@ -3604,6 +3604,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_05.5_EtinasFate/dist/login/config/LoginServer.ini b/L2J_Mobius_05.5_EtinasFate/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_05.5_EtinasFate/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java index 6b58e26541..a91591daea 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java @@ -3616,6 +3616,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_06.0_Fafurion/dist/login/config/LoginServer.ini b/L2J_Mobius_06.0_Fafurion/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_06.0_Fafurion/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java index 65c23bda6a..df87ecb142 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java @@ -3659,6 +3659,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/login/config/LoginServer.ini b/L2J_Mobius_07.0_PreludeOfWar/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java index 74d93f6fc6..0f8c9c2add 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java @@ -3675,6 +3675,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_08.2_Homunculus/dist/login/config/LoginServer.ini b/L2J_Mobius_08.2_Homunculus/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_08.2_Homunculus/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java index eb180070dd..974290b344 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java @@ -3650,6 +3650,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/login/config/LoginServer.ini b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java index f1776fe334..45331862c0 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java @@ -3654,6 +3654,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_10.2_MasterClass/dist/login/config/LoginServer.ini b/L2J_Mobius_10.2_MasterClass/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_10.2_MasterClass/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_10.2_MasterClass/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java index 20a1a3e7db..4c049508a9 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java @@ -3656,6 +3656,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_10.3_MasterClass/dist/login/config/LoginServer.ini b/L2J_Mobius_10.3_MasterClass/dist/login/config/LoginServer.ini index 4841207266..346c185aa7 100644 --- a/L2J_Mobius_10.3_MasterClass/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_10.3_MasterClass/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/Config.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/Config.java index f99b27ac02..3f20d4c7d1 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/Config.java @@ -3698,6 +3698,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_C6_Interlude/dist/login/config/LoginServer.ini b/L2J_Mobius_C6_Interlude/dist/login/config/LoginServer.ini index eddcfed49a..ae69f1b9d5 100644 --- a/L2J_Mobius_C6_Interlude/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_C6_Interlude/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java index 8d86094aa3..d3e715b6a9 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java @@ -2897,6 +2897,19 @@ public class Config MYSQL_BIN_PATH = serverSettings.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = serverSettings.getString("BackupPath", "../backup/"); BACKUP_DAYS = serverSettings.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = serverSettings.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = serverSettings.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = serverSettings.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = serverSettings.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = serverSettings.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = serverSettings.getBoolean("ShowLicence", false); AUTO_CREATE_ACCOUNTS = serverSettings.getBoolean("AutoCreateAccounts", true); FLOOD_PROTECTION = serverSettings.getBoolean("EnableFloodProtection", true); diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/LoginServer.java index a009f2ba12..49186bc9e8 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_CT_0_Interlude/dist/login/config/LoginServer.ini b/L2J_Mobius_CT_0_Interlude/dist/login/config/LoginServer.ini index 49951c3621..df5c9aab82 100644 --- a/L2J_Mobius_CT_0_Interlude/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_CT_0_Interlude/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java index d32c6b9bf2..5e1d98f064 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java @@ -3056,6 +3056,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); FLOOD_PROTECTION = loginConfig.getBoolean("EnableFloodProtection", true); diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/login/config/LoginServer.ini b/L2J_Mobius_CT_2.4_Epilogue/dist/login/config/LoginServer.ini index 43cdcdc509..97ce526d58 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_CT_2.4_Epilogue/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java index fce3c3dc5b..36ea892971 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java @@ -3174,6 +3174,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); FLOOD_PROTECTION = loginConfig.getBoolean("EnableFloodProtection", true); diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/login/config/LoginServer.ini b/L2J_Mobius_CT_2.6_HighFive/dist/login/config/LoginServer.ini index 65b4c65afa..76e8e674ba 100644 --- a/L2J_Mobius_CT_2.6_HighFive/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_CT_2.6_HighFive/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java index a0b3a6a872..d79c3e8e33 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java @@ -3181,6 +3181,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); FLOOD_PROTECTION = loginConfig.getBoolean("EnableFloodProtection", true); diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_1.0/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_1.0/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_1.0/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_1.0/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java index 51736cfe97..a3d42e3d54 100644 --- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java @@ -3464,6 +3464,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java index 4293365913..4c63eaf1e1 100644 --- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java @@ -3510,6 +3510,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_2.0_Saviors/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java index dff1bb7cae..85603353ef 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java @@ -3516,6 +3516,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_2.5_Zaken/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_2.5_Zaken/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java index 33c2624caf..02ab86ee8b 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java @@ -3522,6 +3522,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_2.7_Antharas/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_2.7_Antharas/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java index 33c2624caf..02ab86ee8b 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java @@ -3522,6 +3522,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_2.8_SevenSigns/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java index 33c2624caf..02ab86ee8b 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java @@ -3522,6 +3522,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_2.9.5_Saviors/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_2.9.5_Saviors/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_2.9.5_Saviors/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_2.9.5_Saviors/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/Config.java index 84a5045568..5af9968164 100644 --- a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/Config.java @@ -3545,6 +3545,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_2.9.5_Saviors/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java index 1a7729ebf0..515464c802 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java @@ -3531,6 +3531,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_3.0_TheKamael/dist/login/config/LoginServer.ini index 7ce0641617..4a5c4d9066 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java index 3dc08a2fc1..dd75c0fbf0 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java @@ -3545,6 +3545,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Classic_Interlude/dist/login/config/LoginServer.ini b/L2J_Mobius_Classic_Interlude/dist/login/config/LoginServer.ini index a1627e5d7d..9963eab4e5 100644 --- a/L2J_Mobius_Classic_Interlude/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Classic_Interlude/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java index b8aba88de1..e18c69c269 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java @@ -3519,6 +3519,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/login/config/LoginServer.ini b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/login/config/LoginServer.ini index 0b1653ba1a..64447f8f41 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java index f31b8f239c..565ba4fdcf 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java @@ -3597,6 +3597,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/login/config/LoginServer.ini b/L2J_Mobius_Essence_5.2_FrostLord/dist/login/config/LoginServer.ini index 0b1653ba1a..64447f8f41 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java index b6eeba12d9..f97822bb5d 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java @@ -3699,6 +3699,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/login/config/LoginServer.ini b/L2J_Mobius_Essence_6.2_Vanguard/dist/login/config/LoginServer.ini index 0b1653ba1a..64447f8f41 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java index 822c108408..9da715d50c 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java @@ -3743,6 +3743,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable diff --git a/L2J_Mobius_Essence_6.3_Crusader/dist/login/config/LoginServer.ini b/L2J_Mobius_Essence_6.3_Crusader/dist/login/config/LoginServer.ini index 0b1653ba1a..64447f8f41 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/dist/login/config/LoginServer.ini +++ b/L2J_Mobius_Essence_6.3_Crusader/dist/login/config/LoginServer.ini @@ -67,11 +67,33 @@ MySqlBinLocation = C:/xampp/mysql/bin/ BackupPath = ../backup/ # Maximum number of days that backups will be kept. -# Old backups will be deleted. +# Old files in backup folder will be deleted. # Set to 0 to disable. BackupDays = 30 +# --------------------------------------------------------------------------- +# Thread Configuration +# --------------------------------------------------------------------------- + +# Determines the amount of scheduled thread pools. If set to -1, the server will decide the amount depending on the available processors. +ScheduledThreadPoolCount = 2 + +# Specifies how many threads will be in a single scheduled pool. +ThreadsPerScheduledThreadPool = 2 + +# Determines the amount of instant thread pools. If set to -1, the server will decide the amount depending on the available processors. +InstantThreadPoolCount = 2 + +# Specifies how many threads will be in a single instant pool. +ThreadsPerInstantThreadPool = 4 + +# Use threads to run client packets individually. +# Less lag when using threads, but more CPU consumption. +# Default: True +ThreadsForClientPackets = True + + # --------------------------------------------------------------------------- # Security # --------------------------------------------------------------------------- diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/Config.java index 822c108408..9da715d50c 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/Config.java @@ -3743,6 +3743,19 @@ public class Config MYSQL_BIN_PATH = loginConfig.getString("MySqlBinLocation", "C:/xampp/mysql/bin/"); BACKUP_PATH = loginConfig.getString("BackupPath", "../backup/"); BACKUP_DAYS = loginConfig.getInt("BackupDays", 30); + SCHEDULED_THREAD_POOL_COUNT = loginConfig.getInt("ScheduledThreadPoolCount", 2); + if (SCHEDULED_THREAD_POOL_COUNT == -1) + { + SCHEDULED_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_SCHEDULED_THREAD_POOL = loginConfig.getInt("ThreadsPerScheduledThreadPool", 2); + INSTANT_THREAD_POOL_COUNT = loginConfig.getInt("InstantThreadPoolCount", 2); + if (INSTANT_THREAD_POOL_COUNT == -1) + { + INSTANT_THREAD_POOL_COUNT = Math.max(2, Runtime.getRuntime().availableProcessors() / 2); + } + THREADS_PER_INSTANT_THREAD_POOL = loginConfig.getInt("ThreadsPerInstantThreadPool", 4); + THREADS_FOR_CLIENT_PACKETS = loginConfig.getBoolean("ThreadsForClientPackets", true); SHOW_LICENCE = loginConfig.getBoolean("ShowLicence", true); SHOW_PI_AGREEMENT = loginConfig.getBoolean("ShowPIAgreement", false); AUTO_CREATE_ACCOUNTS = loginConfig.getBoolean("AutoCreateAccounts", true); diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/LoginServer.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/LoginServer.java index 659bd29260..4d9d9e07ab 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/LoginServer.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/LoginServer.java @@ -33,6 +33,7 @@ import org.l2jmobius.commons.database.DatabaseBackup; import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.enums.ServerMode; import org.l2jmobius.commons.network.NetServer; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.PropertiesParser; import org.l2jmobius.gameserver.network.loginserverpackets.game.ServerStatus; import org.l2jmobius.loginserver.network.LoginClient; @@ -95,6 +96,9 @@ public class LoginServer // Prepare Database DatabaseFactory.init(); + // Initialize ThreadPool. + ThreadPool.init(); + try { LoginController.load(); diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java index 50c70e18f8..03e3a9c097 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/loginserver/network/LoginPacketHandler.java @@ -18,10 +18,11 @@ package org.l2jmobius.loginserver.network; import java.util.logging.Logger; +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketHandlerInterface; import org.l2jmobius.commons.network.ReadablePacket; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; -import org.l2jmobius.gameserver.network.PacketLogger; import org.l2jmobius.loginserver.network.clientpackets.LoginClientPacket; /** @@ -42,8 +43,8 @@ public class LoginPacketHandler implements PacketHandlerInterface } catch (Exception e) { - PacketLogger.warning("LoginPacketHandler: Problem receiving packet id from " + client); - PacketLogger.warning(CommonUtil.getStackTrace(e)); + LOGGER.warning("LoginPacketHandler: Problem receiving packet id from " + client); + LOGGER.warning(CommonUtil.getStackTrace(e)); client.disconnect(); return; } @@ -75,10 +76,23 @@ public class LoginPacketHandler implements PacketHandlerInterface } // Continue on another thread. - final Thread thread = new Thread(new ExecuteTask(client, packet, newPacket, packetId), getClass().getName()); - thread.setPriority(Thread.NORM_PRIORITY); - thread.setDaemon(false); - thread.start(); + if (Config.THREADS_FOR_CLIENT_PACKETS) + { + ThreadPool.execute(new ExecuteTask(client, packet, newPacket, packetId)); + } + else // Wait for execution. + { + try + { + newPacket.read(packet); + newPacket.run(client); + } + catch (Exception e) + { + LOGGER.warning("LoginPacketHandler: Problem with " + client + " [Packet: 0x" + Integer.toHexString(packetId).toUpperCase() + "]"); + LOGGER.warning(CommonUtil.getStackTrace(e)); + } + } } private class ExecuteTask implements Runnable