Project

General

Profile

0001-Detect-and-kill-unused-CoreSessions.patch

seezer, 07/22/2009 12:04 PM

View differences:

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
-