X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;fp=src%2Fcore%2Fcore.cpp;h=2634dd2852fb8e04ba240601f6579b7f095d042b;hp=7f69869a5c7d0dcf2a90a131d9a6372a99b2a618;hb=ddfb1d2574c4bffd180361a80df9b1cd584bb040;hpb=72473527f99cbe68dcfcb4ca17f828bd3775bba7 diff --git a/src/core/core.cpp b/src/core/core.cpp index 7f69869a..2634dd28 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -81,7 +81,6 @@ Core::Core() Core::~Core() { - saveState(); qDeleteAll(_connectingClients); qDeleteAll(_sessions); syncStorage(); @@ -260,6 +259,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() @@ -837,10 +869,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)); }