From 4c885cc947853bac034614c658675dcf2a664a4b 2011-09-09 11:51:25 From: HanzZ Date: 2011-09-09 11:51:25 Subject: [PATCH] Proper SIGTERM/SIGINT handlers --- diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index daea9f9a4eb872716a39613dfadf6f259bdfa614..839c612f7bacfb0e3fe2e85ef01d173a7a979a31 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -80,6 +80,8 @@ class UserManager { /// \param user User class to remove void removeUser(User *user); + void removeAllUsers(); + /// Called when new User class is created. /// \param user newly created User class boost::signal onUserCreated; diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 0102256e42ecf2a74a8edf8d76bd6f7949b94c8d..b27d6db8546e0ac0f5e6ef8f5427212b3de917de 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -30,13 +30,21 @@ using namespace Transport; static LoggerPtr logger = log4cxx::Logger::getLogger("Spectrum"); Swift::SimpleEventLoop *eventLoop_ = NULL; +Component *component_ = NULL; +UserManager *userManager_ = NULL; -static void spectrum_sigint_handler(int sig) { +static void stop_spectrum() { + userManager_->removeAllUsers(); + component_->stop(); eventLoop_->stop(); } +static void spectrum_sigint_handler(int sig) { + eventLoop_->postEvent(&stop_spectrum); +} + static void spectrum_sigterm_handler(int sig) { - eventLoop_->stop(); + eventLoop_->postEvent(&stop_spectrum); } #ifndef WIN32 @@ -236,6 +244,7 @@ int main(int argc, char **argv) UserRegistry userRegistry(&config, factories); Component transport(&eventLoop, factories, &config, NULL, &userRegistry); + component_ = &transport; // Logger logger(&transport); StorageBackend *storageBackend = NULL; @@ -260,6 +269,7 @@ int main(int argc, char **argv) #endif UserManager userManager(&transport, &userRegistry, storageBackend); + userManager_ = &userManager; UserRegistration *userRegistration = NULL; if (storageBackend) { userRegistration = new UserRegistration(&transport, &userManager, storageBackend); @@ -275,6 +285,7 @@ int main(int argc, char **argv) eventLoop_ = &eventLoop; eventLoop.run(); + if (userRegistration) { userRegistration->stop(); delete userRegistration; diff --git a/src/transport.cpp b/src/transport.cpp index 765e501d6d519ee10a1e62f1f1e1729a868147bb..8d0e012261bbb8aff67d8a7ac77f40e83fc7fb60 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -177,7 +177,8 @@ void Component::start() { void Component::stop() { if (m_component) { m_reconnectCount = 0; - m_component->disconnect(); + // TODO: Call this once swiften will fix assert(!session_); +// m_component->disconnect(); m_reconnectTimer->stop(); } else if (m_server) { diff --git a/src/usermanager.cpp b/src/usermanager.cpp index e8a037125d0c48c5ea43beed2fc2265e46706d99..9e16691f90afc7be6641996c97087ef8cce5939f 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -105,6 +105,12 @@ void UserManager::removeUser(User *user) { // VALGRIND_DO_LEAK_CHECK; } +void UserManager::removeAllUsers() { + while(m_users.begin() != m_users.end()) { + removeUser((*m_users.begin()).second); + } +} + int UserManager::getUserCount() { return m_users.size(); }