aboutsummaryrefslogtreecommitdiff
path: root/src/server/authserver/Main.cpp
diff options
context:
space:
mode:
authorleak <leak@bitmx.net>2014-05-17 20:27:39 +0200
committerleak <leak@bitmx.net>2014-05-30 14:54:56 +0200
commit5a363ee0e1556b58ad1d16ce2b78ae5f92e065ea (patch)
tree5e2ab55d77fd1966ee1cf5370b9c9d59bedb78d7 /src/server/authserver/Main.cpp
parent35c2e972076b1f039ab17ddd35f2d08c125ce383 (diff)
Replace authserver ACE related code with Boost/C++11
Diffstat (limited to 'src/server/authserver/Main.cpp')
-rw-r--r--src/server/authserver/Main.cpp240
1 files changed, 117 insertions, 123 deletions
diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp
index 0ccad3d1d8a..c8be23ca524 100644
--- a/src/server/authserver/Main.cpp
+++ b/src/server/authserver/Main.cpp
@@ -24,11 +24,13 @@
* authentication server
*/
-#include <ace/Dev_Poll_Reactor.h>
-#include <ace/TP_Reactor.h>
#include <openssl/opensslv.h>
#include <openssl/crypto.h>
-#include <boost/asio/signal_set.hpp>
+#include <iostream>
+#include <cstdlib>
+#include <boost/bind.hpp>
+#include <boost/asio.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
#include "Common.h"
#include "Database/DatabaseEnv.h"
@@ -36,9 +38,9 @@
#include "Log.h"
#include "SystemConfig.h"
#include "Util.h"
-#include "SignalHandler.h"
#include "RealmList.h"
-#include "RealmAcceptor.h"
+#include "AuthServer.h"
+
#ifdef __linux__
#include <sched.h>
@@ -52,24 +54,41 @@
bool StartDB();
void StopDB();
+void SetProcessPriority();
-bool stopEvent = false; // Setting it to true stops the server
+boost::asio::io_service _ioService;
+boost::asio::deadline_timer _dbPingTimer(_ioService);
+uint32 _dbPingInterval;
LoginDatabaseWorkerPool LoginDatabase; // Accessor to the authserver database
-void SignalHandler(const boost::system::error_code& error, int signalNumber)
-{
- TC_LOG_ERROR("server.authserver", "SIGNAL HANDLER WORKING");
- if (!error)
- {
+using boost::asio::ip::tcp;
+
+
+void SignalHandler(const boost::system::error_code& error, int signalNumber)
+{
+ TC_LOG_ERROR("server.authserver", "SIGNAL HANDLER WORKING");
+ if (!error)
+ {
switch (signalNumber)
{
case SIGINT:
case SIGTERM:
- stopEvent = true;
+ _ioService.stop();
break;
}
- }
+ }
+}
+
+void KeepDatabaseAliveHandler(const boost::system::error_code& error)
+{
+ if (!error)
+ {
+ TC_LOG_INFO("server.authserver", "Ping MySQL to keep connection alive");
+ LoginDatabase.KeepAlive();
+
+ _dbPingTimer.expires_from_now(boost::posix_time::minutes(_dbPingInterval));
+ }
}
/// Print out the usage string for this program on the console.
@@ -81,7 +100,7 @@ void usage(const char* prog)
}
/// Launch the auth server
-extern int main(int argc, char** argv)
+int main(int argc, char** argv)
{
// Command line parsing to get the configuration file name
char const* configFile = _TRINITY_REALM_CONFIG;
@@ -115,14 +134,6 @@ extern int main(int argc, char** argv)
TC_LOG_WARN("server.authserver", "%s (Library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION));
-#if defined (ACE_HAS_EVENT_POLL) || defined (ACE_HAS_DEV_POLL)
- ACE_Reactor::instance(new ACE_Reactor(new ACE_Dev_Poll_Reactor(ACE::max_handles(), 1), 1), true);
-#else
- ACE_Reactor::instance(new ACE_Reactor(new ACE_TP_Reactor(), true), true);
-#endif
-
- TC_LOG_DEBUG("server.authserver", "Max allowed open files is %d", ACE::max_handles());
-
// authserver PID file creation
std::string pidFile = sConfigMgr->GetStringDefault("PidFile", "");
if (!pidFile.empty())
@@ -149,121 +160,32 @@ extern int main(int argc, char** argv)
}
// Launch the listening network socket
- RealmAcceptor acceptor;
- int32 rmport = sConfigMgr->GetIntDefault("RealmServerPort", 3724);
- if (rmport < 0 || rmport > 0xFFFF)
+ int32 port = sConfigMgr->GetIntDefault("RealmServerPort", 3724);
+ if (port < 0 || port > 0xFFFF)
{
TC_LOG_ERROR("server.authserver", "Specified port out of allowed range (1-65535)");
return 1;
}
- std::string bind_ip = sConfigMgr->GetStringDefault("BindIP", "0.0.0.0");
+ std::string bindIp = sConfigMgr->GetStringDefault("BindIP", "0.0.0.0");
- ACE_INET_Addr bind_addr(uint16(rmport), bind_ip.c_str());
-
- if (acceptor.open(bind_addr, ACE_Reactor::instance(), ACE_NONBLOCK) == -1)
- {
- TC_LOG_ERROR("server.authserver", "Auth server can not bind to %s:%d", bind_ip.c_str(), rmport);
- return 1;
- }
-
- boost::asio::io_service io_service;
-
- boost::asio::signal_set signals(io_service, SIGINT, SIGTERM);
+ AuthServer authServer(_ioService, bindIp, port);
+ // Set signal handlers
+ boost::asio::signal_set signals(_ioService, SIGINT, SIGTERM);
signals.async_wait(SignalHandler);
-#if defined(_WIN32) || defined(__linux__)
-
- ///- Handle affinity for multiple processors and process priority
- uint32 affinity = sConfigMgr->GetIntDefault("UseProcessors", 0);
- bool highPriority = sConfigMgr->GetBoolDefault("ProcessPriority", false);
-
-#ifdef _WIN32 // Windows
-
- HANDLE hProcess = GetCurrentProcess();
- if (affinity > 0)
- {
- ULONG_PTR appAff;
- ULONG_PTR sysAff;
-
- if (GetProcessAffinityMask(hProcess, &appAff, &sysAff))
- {
- // remove non accessible processors
- ULONG_PTR currentAffinity = affinity & appAff;
-
- if (!currentAffinity)
- TC_LOG_ERROR("server.authserver", "Processors marked in UseProcessors bitmask (hex) %x are not accessible for the authserver. Accessible processors bitmask (hex): %x", affinity, appAff);
- else if (SetProcessAffinityMask(hProcess, currentAffinity))
- TC_LOG_INFO("server.authserver", "Using processors (bitmask, hex): %x", currentAffinity);
- else
- TC_LOG_ERROR("server.authserver", "Can't set used processors (hex): %x", currentAffinity);
- }
- }
-
- if (highPriority)
- {
- if (SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS))
- TC_LOG_INFO("server.authserver", "authserver process priority class set to HIGH");
- else
- TC_LOG_ERROR("server.authserver", "Can't set authserver process priority class.");
- }
-
-#else // Linux
-
- if (affinity > 0)
- {
- cpu_set_t mask;
- CPU_ZERO(&mask);
-
- for (unsigned int i = 0; i < sizeof(affinity) * 8; ++i)
- if (affinity & (1 << i))
- CPU_SET(i, &mask);
-
- if (sched_setaffinity(0, sizeof(mask), &mask))
- TC_LOG_ERROR("server.authserver", "Can't set used processors (hex): %x, error: %s", affinity, strerror(errno));
- else
- {
- CPU_ZERO(&mask);
- sched_getaffinity(0, sizeof(mask), &mask);
- TC_LOG_INFO("server.authserver", "Using processors (bitmask, hex): %lx", *(__cpu_mask*)(&mask));
- }
- }
-
- if (highPriority)
- {
- if (setpriority(PRIO_PROCESS, 0, PROCESS_HIGH_PRIORITY))
- TC_LOG_ERROR("server.authserver", "Can't set authserver process priority class, error: %s", strerror(errno));
- else
- TC_LOG_INFO("server.authserver", "authserver process priority class set to %i", getpriority(PRIO_PROCESS, 0));
- }
-
-#endif
-#endif
+ SetProcessPriority();
- // maximum counter for next ping
- uint32 numLoops = (sConfigMgr->GetIntDefault("MaxPingTime", 30) * (MINUTE * 1000000 / 100000));
- uint32 loopCounter = 0;
-
- // Wait for termination signal
- while (!stopEvent)
- {
- // dont move this outside the loop, the reactor will modify it
- ACE_Time_Value interval(0, 100000);
- if (ACE_Reactor::instance()->run_reactor_event_loop(interval) == -1)
- break;
+ _dbPingInterval = sConfigMgr->GetIntDefault("MaxPingTime", 30);
- io_service.run();
+ _dbPingTimer.expires_from_now(boost::posix_time::seconds(_dbPingInterval));
+ _dbPingTimer.async_wait(KeepDatabaseAliveHandler);
- if ((++loopCounter) == numLoops)
- {
- loopCounter = 0;
- TC_LOG_INFO("server.authserver", "Ping MySQL to keep connection alive");
- LoginDatabase.KeepAlive();
- }
- }
+ // Start the io service
+ _ioService.run();
// Close the Database Pool and library
StopDB();
@@ -272,6 +194,7 @@ extern int main(int argc, char** argv)
return 0;
}
+
/// Initialize connection to the database
bool StartDB()
{
@@ -316,3 +239,74 @@ void StopDB()
LoginDatabase.Close();
MySQL::Library_End();
}
+
+void SetProcessPriority()
+{
+#if defined(_WIN32) || defined(__linux__)
+
+ ///- Handle affinity for multiple processors and process priority
+ uint32 affinity = sConfigMgr->GetIntDefault("UseProcessors", 0);
+ bool highPriority = sConfigMgr->GetBoolDefault("ProcessPriority", false);
+
+#ifdef _WIN32 // Windows
+
+ HANDLE hProcess = GetCurrentProcess();
+ if (affinity > 0)
+ {
+ ULONG_PTR appAff;
+ ULONG_PTR sysAff;
+
+ if (GetProcessAffinityMask(hProcess, &appAff, &sysAff))
+ {
+ // remove non accessible processors
+ ULONG_PTR currentAffinity = affinity & appAff;
+
+ if (!currentAffinity)
+ TC_LOG_ERROR("server.authserver", "Processors marked in UseProcessors bitmask (hex) %x are not accessible for the authserver. Accessible processors bitmask (hex): %x", affinity, appAff);
+ else if (SetProcessAffinityMask(hProcess, currentAffinity))
+ TC_LOG_INFO("server.authserver", "Using processors (bitmask, hex): %x", currentAffinity);
+ else
+ TC_LOG_ERROR("server.authserver", "Can't set used processors (hex): %x", currentAffinity);
+ }
+ }
+
+ if (highPriority)
+ {
+ if (SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS))
+ TC_LOG_INFO("server.authserver", "authserver process priority class set to HIGH");
+ else
+ TC_LOG_ERROR("server.authserver", "Can't set authserver process priority class.");
+ }
+
+#else // Linux
+
+ if (affinity > 0)
+ {
+ cpu_set_t mask;
+ CPU_ZERO(&mask);
+
+ for (unsigned int i = 0; i < sizeof(affinity) * 8; ++i)
+ if (affinity & (1 << i))
+ CPU_SET(i, &mask);
+
+ if (sched_setaffinity(0, sizeof(mask), &mask))
+ TC_LOG_ERROR("server.authserver", "Can't set used processors (hex): %x, error: %s", affinity, strerror(errno));
+ else
+ {
+ CPU_ZERO(&mask);
+ sched_getaffinity(0, sizeof(mask), &mask);
+ TC_LOG_INFO("server.authserver", "Using processors (bitmask, hex): %lx", *(__cpu_mask*)(&mask));
+ }
+ }
+
+ if (highPriority)
+ {
+ if (setpriority(PRIO_PROCESS, 0, PROCESS_HIGH_PRIORITY))
+ TC_LOG_ERROR("server.authserver", "Can't set authserver process priority class, error: %s", strerror(errno));
+ else
+ TC_LOG_INFO("server.authserver", "authserver process priority class set to %i", getpriority(PRIO_PROCESS, 0));
+ }
+
+#endif
+#endif
+} \ No newline at end of file