0001-Detect-and-kill-unused-CoreSessions.patch
| src/core/core.cpp | ||
|---|---|---|
| 985 | 985 | return settings; | 
| 986 | 986 | } | 
| 987 | 987 | |
| 988 | void Core::deleteCoreSession(UserId id) { | |
| 989 | sessions.take(id)->deleteLater(); | |
| 990 | } | |
| 988 | 991 | |
| 989 | 992 | #ifdef Q_OS_WIN32 | 
| 990 | 993 | void Core::stdInEcho(bool on) { | 
| src/core/core.h | ||
|---|---|---|
| 391 | 391 | void syncStorage(); | 
| 392 | 392 | void setupInternalClientSession(SignalProxy *proxy); | 
| 393 | 393 | |
| 394 | //! Delete an unused CoreSession and its corresponding thread | |
| 395 | /** \param id The UserId of the Session | |
| 396 | */ | |
| 397 | void deleteCoreSession(UserId id); | |
| 398 | ||
| 394 | 399 | signals: | 
| 395 | 400 | //! Sent when a BufferInfo is updated in storage. | 
| 396 | 401 | void bufferInfoUpdated(UserId user, const BufferInfo &info); | 
| src/core/coresession.cpp | ||
|---|---|---|
| 89 | 89 | p->synchronize(ircListHelper()); | 
| 90 | 90 | p->synchronize(&_coreInfo); | 
| 91 | 91 | |
| 92 | // let core remove the session from its structures and delete it afterwards | |
| 93 | connect(this, SIGNAL(deleteCoreSession(UserId)), Core::instance(), SLOT(deleteCoreSession(UserId)), Qt::QueuedConnection); | |
| 94 | connect(this, SIGNAL(deleteCoreSessionLater(UserId)), this, SIGNAL(deleteCoreSession(UserId)), Qt::QueuedConnection); | |
| 92 | 95 | // Restore session state | 
| 93 | 96 | if(restoreState) | 
| 94 | restoreSessionState(); | |
| 97 | if(!restoreSessionState()) | |
| 98 | // if we have nothing to restore, this CoreSession is useless | |
| 99 | // until the user decides to connect | |
| 100 | emit deleteCoreSessionLater(_user); | |
| 95 | 101 | |
| 96 | 102 | emit initialized(); | 
| 97 | 103 | } | 
| ... | ... | |
| 150 | 156 | _bufferViewManager->saveBufferViews(); | 
| 151 | 157 | } | 
| 152 | 158 | |
| 153 | void CoreSession::restoreSessionState() { | |
| 159 | bool CoreSession::restoreSessionState() { | |
| 154 | 160 | QList<NetworkId> nets = Core::connectedNetworks(user()); | 
| 161 | ||
| 162 | if(nets.empty()) | |
| 163 | return false; | |
| 164 | ||
| 155 | 165 | CoreNetwork *net = 0; | 
| 166 | bool restored = false; | |
| 156 | 167 |   foreach(NetworkId id, nets) { | 
| 157 | 168 | net = network(id); | 
| 158 | 169 | Q_ASSERT(net); | 
| 159 | 170 | net->connectToIrc(); | 
| 171 | restored = true; | |
| 160 | 172 | } | 
| 173 | return restored; | |
| 161 | 174 | } | 
| 162 | 175 | |
| 163 | 176 | void CoreSession::addClient(QIODevice *device) { | 
| ... | ... | |
| 462 | 475 | CoreNetwork *net = 0; | 
| 463 | 476 | IrcUser *me = 0; | 
| 464 | 477 | QString awayReason; | 
| 478 | bool activeNetworks = false; | |
| 479 | ||
| 465 | 480 |   while(netIter != _networks.end()) { | 
| 466 | 481 | net = *netIter; | 
| 467 | 482 | netIter++; | 
| 468 | 483 | |
| 484 | if(net->connectionState() != Network::Disconnected) | |
| 485 | activeNetworks = true; | |
| 469 | 486 | if(!net->isConnected()) | 
| 470 | 487 | continue; | 
| 471 | 488 | identity = net->identityPtr(); | 
| ... | ... | |
| 482 | 499 | net->userInputHandler()->handleAway(BufferInfo(), awayReason); | 
| 483 | 500 | } | 
| 484 | 501 | } | 
| 502 | // if no networks are active and the last client disconnected, we assume the session is useless | |
| 503 | if(!activeNetworks) | |
| 504 | emit deleteCoreSessionLater(_user); | |
| 485 | 505 | } | 
| src/core/coresession.h | ||
|---|---|---|
| 68 | 68 | |
| 69 | 69 | //! Return necessary data for restoring the session after restarting the core | 
| 70 | 70 | void saveSessionState() const; | 
| 71 | void restoreSessionState(); | |
| 71 | //! Restore session after restarting the core | |
| 72 | /** Returns true if anything is restored, false if not. | |
| 73 | */ | |
| 74 | bool restoreSessionState(); | |
| 72 | 75 | |
| 73 | 76 | public slots: | 
| 74 | 77 | void addClient(QIODevice *device); | 
| ... | ... | |
| 131 | 134 | void networkCreated(NetworkId); | 
| 132 | 135 | void networkRemoved(NetworkId); | 
| 133 | 136 | |
| 137 | //! CoreSession assumed useless | |
| 138 | /** This signal is propagated to the core to request the destruction of the senders session. | |
| 139 | * \param id The UserId of this session | |
| 140 | */ | |
| 141 | void deleteCoreSession(UserId id); | |
| 142 | ||
| 143 | //! CoreSession assumed useles | |
| 144 | /** This signal is only a helper to deleteCoreSession and emits that whenever the eventloop is | |
| 145 | * running. | |
| 146 | * \param id The UserId of this session | |
| 147 | */ | |
| 148 | void deleteCoreSessionLater(UserId id); | |
| 149 | ||
| 134 | 150 | private slots: | 
| 135 | 151 | void removeClient(QIODevice *dev); | 
| 136 | 152 | |
| 137 | - | |