X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;h=e1ea08320c4ca5b534c0fc86f9fc23cafa6da370;hp=9b7af58d03184a289e921dd94a13fe48362ebc07;hb=bad087a1b604c92c7c0bf3cf818b81d26e15c1c4;hpb=f88bfa81380ceb2c4afce5b15f753570a1ef063d diff --git a/src/core/core.cpp b/src/core/core.cpp index 9b7af58d..e1ea0832 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -36,9 +36,8 @@ #include "types.h" #include "util.h" -// Currently building with LDAP bindings is optional. #ifdef HAVE_LDAP -#include "ldapauthenticator.h" +# include "ldapauthenticator.h" #endif // migration related @@ -67,22 +66,10 @@ public: // ============================== // Core // ============================== -Core *Core::_instance{nullptr}; - -Core *Core::instance() -{ - return _instance; -} - Core::Core() + : Singleton{this} { - if (_instance) { - qWarning() << "Recreating core instance!"; - delete _instance; - } - _instance = this; - // Parent all QObject-derived attributes, so when the Core instance gets moved into another // thread, they get moved with it _server.setParent(this); @@ -93,11 +80,9 @@ Core::Core() Core::~Core() { - saveState(); qDeleteAll(_connectingClients); qDeleteAll(_sessions); syncStorage(); - _instance = nullptr; } @@ -105,10 +90,6 @@ void Core::init() { _startTime = QDateTime::currentDateTime().toUTC(); // for uptime :) - if (Quassel::runMode() == Quassel::RunMode::CoreOnly) { - Quassel::loadTranslation(QLocale::system()); - } - // check settings version // so far, we only have 1 CoreSettings s; @@ -273,6 +254,39 @@ void Core::initAsync() } +void Core::shutdown() +{ + quInfo() << "Core shutting down..."; + + saveState(); + + for (auto &&client : _connectingClients) { + client->deleteLater(); + } + _connectingClients.clear(); + + if (_sessions.isEmpty()) { + emit shutdownComplete(); + return; + } + + for (auto &&session : _sessions) { + connect(session, SIGNAL(shutdownComplete(SessionThread*)), this, SLOT(onSessionShutdown(SessionThread*))); + session->shutdown(); + } +} + + +void Core::onSessionShutdown(SessionThread *session) +{ + _sessions.take(_sessions.key(session))->deleteLater(); + if (_sessions.isEmpty()) { + quInfo() << "Core shutdown complete!"; + emit shutdownComplete(); + } +} + + /*** Session Restore ***/ void Core::saveState() @@ -850,10 +864,7 @@ SessionThread *Core::sessionForUser(UserId uid, bool restore) if (_sessions.contains(uid)) return _sessions[uid]; - SessionThread *session = new SessionThread(uid, restore, strictIdentEnabled(), this); - _sessions[uid] = session; - session->start(); - return session; + return (_sessions[uid] = new SessionThread(uid, restore, strictIdentEnabled(), this)); }