QtNetwork: replace Java-style iterators

... with STL-style iterators or with algorithms.
Java-style iterators have overhead.

Introduce local template separate_if algorithm from kleopatra
project to simplify current code.
http://api.kde.org/4.3-api/kdepim-apidocs/kleopatra/html

Done-with: Marc Mutz <marc.mutz@kdab.com>
Change-Id: Ib154f80f46f8041d9cafd81bed0e1982b21541cf
Reviewed-by: Edward Welbourne <edward.welbourne@theqtcompany.com>
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
Anton Kudryavtsev 2016-03-04 10:51:12 +03:00
parent 7094466f7d
commit 35b0ecf5da
4 changed files with 54 additions and 52 deletions

View File

@ -384,25 +384,21 @@ QList<QNetworkConfiguration> QNetworkConfiguration::children() const
if (d->type != QNetworkConfiguration::ServiceNetwork || !d->isValid)
return results;
QMutableMapIterator<unsigned int, QNetworkConfigurationPrivatePointer> i(d->serviceNetworkMembers);
while (i.hasNext()) {
i.next();
QNetworkConfigurationPrivatePointer p = i.value();
for (auto it = d->serviceNetworkMembers.begin(), end = d->serviceNetworkMembers.end(); it != end;) {
QNetworkConfigurationPrivatePointer p = it.value();
//if we have an invalid member get rid of it -> was deleted earlier on
{
QMutexLocker childLocker(&p->mutex);
if (!p->isValid) {
i.remove();
it = d->serviceNetworkMembers.erase(it);
continue;
}
}
QNetworkConfiguration item;
item.d = p;
results << item;
++it;
}
return results;

View File

@ -79,6 +79,22 @@ bool any_of(InputIt first, InputIt last, UnaryPredicate p)
{
return std::find_if(first, last, p) != last;
}
template <typename InputIt, typename OutputIt1, typename OutputIt2, typename UnaryPredicate>
std::pair<OutputIt1, OutputIt2> separate_if(InputIt first, InputIt last, OutputIt1 dest1, OutputIt2 dest2, UnaryPredicate p)
{
while (first != last) {
if (p(*first)) {
*dest1 = *first;
++dest1;
} else {
*dest2 = *first;
++dest2;
}
++first;
}
return std::make_pair(dest1, dest2);
}
}
/*!
@ -587,46 +603,37 @@ void QHostInfoLookupManager::work()
finishedLookups.clear();
}
if (!postponedLookups.isEmpty()) {
// try to start the postponed ones
auto isAlreadyRunning = [this](QHostInfoRunnable *lookup) {
return any_of(currentLookups.cbegin(), currentLookups.cend(), ToBeLookedUpEquals(lookup->toBeLookedUp));
};
QMutableListIterator<QHostInfoRunnable*> iterator(postponedLookups);
while (iterator.hasNext()) {
QHostInfoRunnable* postponed = iterator.next();
// Transfer any postponed lookups that aren't currently running to the scheduled list, keeping already-running lookups:
postponedLookups.erase(separate_if(postponedLookups.begin(),
postponedLookups.end(),
postponedLookups.begin(),
std::front_inserter(scheduledLookups), // prepend! we want to finish it ASAP
isAlreadyRunning).first,
postponedLookups.end());
// check if none of the postponed hostnames is currently running
const bool alreadyRunning = any_of(currentLookups.cbegin(), currentLookups.cend(), ToBeLookedUpEquals(postponed->toBeLookedUp));
if (!alreadyRunning) {
iterator.remove();
scheduledLookups.prepend(postponed); // prepend! we want to finish it ASAP
}
// Unschedule and postpone any that are currently running:
scheduledLookups.erase(separate_if(scheduledLookups.begin(),
scheduledLookups.end(),
std::back_inserter(postponedLookups),
scheduledLookups.begin(),
isAlreadyRunning).second,
scheduledLookups.end());
const int availableThreads = threadPool.maxThreadCount() - currentLookups.size();
if (availableThreads > 0) {
int readyToStartCount = qMin(availableThreads, scheduledLookups.size());
auto it = scheduledLookups.begin();
while (readyToStartCount--) {
// runnable now running in new thread, track this in currentLookups
threadPool.start(*it);
currentLookups.push_back(std::move(*it));
++it;
}
}
if (!scheduledLookups.isEmpty()) {
// try to start the new ones
QMutableListIterator<QHostInfoRunnable*> iterator(scheduledLookups);
while (iterator.hasNext()) {
QHostInfoRunnable *scheduled = iterator.next();
// check if a lookup for this host is already running, then postpone
const bool alreadyRunning = any_of(currentLookups.cbegin(), currentLookups.cend(), ToBeLookedUpEquals(scheduled->toBeLookedUp));
if (alreadyRunning) {
iterator.remove();
postponedLookups.append(scheduled);
scheduled = 0;
}
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 {
// was postponed, continue iterating
continue;
}
};
scheduledLookups.erase(scheduledLookups.begin(), it);
}
}

View File

@ -396,12 +396,12 @@ void QSocks5BindStore::timerEvent(QTimerEvent * event)
QMutexLocker lock(&mutex);
if (event->timerId() == sweepTimerId) {
QSOCKS5_DEBUG << "QSocks5BindStore performing sweep";
QMutableHashIterator<int, QSocks5BindData *> it(store);
while (it.hasNext()) {
it.next();
for (auto it = store.begin(), end = store.end(); it != end;) {
if (it.value()->timeStamp.hasExpired(350000)) {
QSOCKS5_DEBUG << "QSocks5BindStore removing JJJJ";
it.remove();
it = store.erase(it);
} else {
++it;
}
}
}

View File

@ -747,9 +747,8 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
certFiles.insert(it.fileInfo().canonicalFilePath());
}
}
QSetIterator<QString> it(certFiles);
while (it.hasNext())
systemCerts.append(QSslCertificate::fromPath(it.next(), platformEncodingFormat));
for (const QString& file : qAsConst(certFiles))
systemCerts.append(QSslCertificate::fromPath(file, platformEncodingFormat));
# ifndef Q_OS_ANDROID
systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva
systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss