src/network/kernel/qhostinfo.cpp
branchGCC_SURGE
changeset 31 5daf16870df6
parent 30 5dc02b23752f
child 37 758a864f9613
--- a/src/network/kernel/qhostinfo.cpp	Mon Jun 21 22:38:13 2010 +0100
+++ b/src/network/kernel/qhostinfo.cpp	Thu Jul 22 16:41:55 2010 +0100
@@ -44,14 +44,10 @@
 
 #include "QtCore/qscopedpointer.h"
 #include <qabstracteventdispatcher.h>
-#include <private/qunicodetables_p.h>
 #include <qcoreapplication.h>
 #include <qmetaobject.h>
-#include <qregexp.h>
-#include <private/qnativesocketengine_p.h>
 #include <qstringlist.h>
 #include <qthread.h>
-#include <qtimer.h>
 #include <qurl.h>
 
 #ifdef Q_OS_UNIX
@@ -172,7 +168,7 @@
     if (name.isEmpty()) {
         QHostInfo hostInfo(id);
         hostInfo.setError(QHostInfo::HostNotFound);
-        hostInfo.setErrorString(QObject::tr("No host name given"));
+        hostInfo.setErrorString(QCoreApplication::translate("QHostInfo", "No host name given"));
         QScopedPointer<QHostInfoResult> result(new QHostInfoResult);
         QObject::connect(result.data(), SIGNAL(resultsReady(QHostInfo)),
                          receiver, member, Qt::QueuedConnection);
@@ -471,6 +467,18 @@
     hostInfo.setLookupId(id);
     resultEmitter.emitResultsReady(hostInfo);
 
+    // now also iterate through the postponed ones
+    QMutableListIterator<QHostInfoRunnable*> iterator(manager->postponedLookups);
+    while (iterator.hasNext()) {
+        QHostInfoRunnable* postponed = iterator.next();
+        if (toBeLookedUp == postponed->toBeLookedUp) {
+            // we can now emit
+            iterator.remove();
+            hostInfo.setLookupId(postponed->id);
+            postponed->resultEmitter.emitResultsReady(hostInfo);
+        }
+    }
+
     manager->lookupFinished(this);
 
     // thread goes back to QThreadPool
@@ -488,9 +496,23 @@
     wasDeleted = true;
 
     // don't qDeleteAll currentLookups, the QThreadPool has ownership
-    qDeleteAll(postponedLookups);
-    qDeleteAll(scheduledLookups);
-    qDeleteAll(finishedLookups);
+    clear();
+}
+
+void QHostInfoLookupManager::clear()
+{
+    {
+        QMutexLocker locker(&mutex);
+        qDeleteAll(postponedLookups);
+        qDeleteAll(scheduledLookups);
+        qDeleteAll(finishedLookups);
+        postponedLookups.clear();
+        scheduledLookups.clear();
+        finishedLookups.clear();
+    }
+
+    threadPool.waitForDone();
+    cache.clear();
 }
 
 void QHostInfoLookupManager::work()
@@ -551,13 +573,11 @@
                 }
             }
 
-            if (scheduled && threadPool.tryStart(scheduled)) {
+            if (scheduled && currentLookups.size() < threadPool.maxThreadCount()) {
                 // runnable now running in new thread, track this in currentLookups
+                threadPool.start(scheduled);
                 iterator.remove();
                 currentLookups.append(scheduled);
-            } else if (scheduled) {
-                // wanted to start, but could not because thread pool is busy
-                break;
             } else {
                 // was postponed, continue iterating
                 continue;
@@ -584,6 +604,23 @@
         return;
 
     QMutexLocker locker(&this->mutex);
+
+    // is postponed? delete and return
+    for (int i = 0; i < postponedLookups.length(); i++) {
+        if (postponedLookups.at(i)->id == id) {
+            delete postponedLookups.takeAt(i);
+            return;
+        }
+    }
+
+    // is scheduled? delete and return
+    for (int i = 0; i < scheduledLookups.length(); i++) {
+        if (scheduledLookups.at(i)->id == id) {
+            delete scheduledLookups.takeAt(i);
+            return;
+        }
+    }
+
     if (!abortedLookups.contains(id))
         abortedLookups.append(id);
 }
@@ -636,7 +673,7 @@
 {
     QHostInfoLookupManager* manager = theHostInfoLookupManager();
     if (manager) {
-        manager->cache.clear();
+        manager->clear();
     }
 }