Stop core from crashing when exiting while clients are still connected.
authorManuel Nickschas <sputnick@quassel-irc.org>
Mon, 18 Feb 2008 01:06:01 +0000 (01:06 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Mon, 18 Feb 2008 01:06:01 +0000 (01:06 +0000)
src/common/signalproxy.cpp
src/core/core.cpp
version.inc

index f0c7d0b..8d9d8b3 100644 (file)
@@ -200,6 +200,12 @@ SignalProxy::~SignalProxy() {
   QList<QObject*> senders = _relayHash.keys();
   foreach(QObject* sender, senders)
     detachObject(sender);
   QList<QObject*> senders = _relayHash.keys();
   foreach(QObject* sender, senders)
     detachObject(sender);
+
+  // close peer connections
+  foreach(QIODevice *device, _peerByteCount.keys()) {
+    device->close();
+    delete device;
+  }
 }
 
 void SignalProxy::setProxyMode(ProxyMode mode) {
 }
 
 void SignalProxy::setProxyMode(ProxyMode mode) {
index c06ca6d..c0b9a50 100644 (file)
@@ -84,7 +84,7 @@ void Core::init() {
 }
 
 Core::~Core() {
 }
 
 Core::~Core() {
-  foreach(QTcpSocket *socket, blocksizes.keys()) {
+  foreach(QTcpSocket *socket, blocksizes.keys()) { qDebug() << "disconnecting" << socket << blocksizes.keys();
     socket->disconnectFromHost();  // disconnect local (i.e. non-authed) clients
   }
   qDeleteAll(sessions);
     socket->disconnectFromHost();  // disconnect local (i.e. non-authed) clients
   }
   qDeleteAll(sessions);
@@ -315,6 +315,7 @@ void Core::clientHasData() {
   while(SignalProxy::readDataFromDevice(socket, blocksizes[socket], item)) {
     QVariantMap msg = item.toMap();
     processClientMessage(socket, msg);
   while(SignalProxy::readDataFromDevice(socket, blocksizes[socket], item)) {
     QVariantMap msg = item.toMap();
     processClientMessage(socket, msg);
+    if(!blocksizes.contains(socket)) break;  // this socket is no longer ours to handle!
   }
 }
 
   }
 }
 
index bbc453f..3a37ae6 100644 (file)
@@ -5,7 +5,7 @@
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-18";
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-18";
-  quasselBuild = 526;
+  quasselBuild = 528;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 526;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 526;