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:
parent
7094466f7d
commit
35b0ecf5da
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user