// the QHostInfoLookupManager will at some point call this via a QThreadPool void QHostInfoRunnable::run() { QHostInfoLookupManager *manager = theHostInfoLookupManager(); // check aborted if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } // check cache // FIXME // if not in cache: OS lookup QHostInfo hostInfo = QHostInfoAgent::fromName(toBeLookedUp); // save to cache // FIXME // check aborted again if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } // signal emission hostInfo.setLookupId(id); resultEmitter.emitResultsReady(hostInfo); manager->lookupFinished(this); // thread goes back to QThreadPool }
// the QHostInfoLookupManager will at some point call this via a QThreadPool void QHostInfoRunnable::run() { QHostInfoLookupManager *manager = theHostInfoLookupManager(); // check aborted if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } QHostInfo hostInfo; // QHostInfo::lookupHost already checks the cache. However we need to check // it here too because it might have been cache saved by another QHostInfoRunnable // in the meanwhile while this QHostInfoRunnable was scheduled but not running if (manager->cache.isEnabled()) { // check the cache first bool valid = false; hostInfo = manager->cache.get(toBeLookedUp, &valid); if (!valid) { // not in cache, we need to do the lookup and store the result in the cache hostInfo = QHostInfoAgent::fromName(toBeLookedUp); manager->cache.put(toBeLookedUp, hostInfo); } } else { // cache is not enabled, just do the lookup and continue hostInfo = QHostInfoAgent::fromName(toBeLookedUp); } // check aborted again if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } // signal emission hostInfo.setLookupId(id); resultEmitter.emitResultsReady(hostInfo); // now also iterate through the postponed ones { QMutexLocker locker(&manager->mutex); 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); delete postponed; } } } manager->lookupFinished(this); // thread goes back to QThreadPool }