QtNetwork: optimize container usage

Don't perform lookup twice. Just cache iterator
or position.

Change-Id: I454fd292614dee62167ff248fc3ddec0f79435b0
Reviewed-by: Edward Welbourne <edward.welbourne@theqtcompany.com>
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
bb10
Anton Kudryavtsev 2016-03-03 15:55:47 +03:00
parent 37d89fd8fb
commit 089ed1525e
7 changed files with 61 additions and 43 deletions

View File

@ -731,10 +731,11 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
QList<QByteArray> headers = newHttpRequest.rawHeaderList();
if (resumeOffset != 0) {
if (headers.contains("Range")) {
const int rangeIndex = headers.indexOf("Range");
if (rangeIndex != -1) {
// Need to adjust resume offset for user specified range
headers.removeOne("Range");
headers.removeAt(rangeIndex);
// We've already verified that requestRange starts with "bytes=", see canResume.
QByteArray requestRange = newHttpRequest.rawHeader("Range").mid(6);
@ -2145,15 +2146,18 @@ void QNetworkReplyHttpImplPrivate::_q_metaDataChanged()
Q_Q(QNetworkReplyHttpImpl);
// 1. do we have cookies?
// 2. are we allowed to set them?
if (cookedHeaders.contains(QNetworkRequest::SetCookieHeader) && manager
&& (static_cast<QNetworkRequest::LoadControl>
(request.attribute(QNetworkRequest::CookieSaveControlAttribute,
QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Automatic)) {
QList<QNetworkCookie> cookies =
qvariant_cast<QList<QNetworkCookie> >(cookedHeaders.value(QNetworkRequest::SetCookieHeader));
QNetworkCookieJar *jar = manager->cookieJar();
if (jar)
jar->setCookiesFromUrl(cookies, url);
if (manager) {
const auto it = cookedHeaders.constFind(QNetworkRequest::SetCookieHeader);
if (it != cookedHeaders.cend()
&& request.attribute(QNetworkRequest::CookieSaveControlAttribute,
QNetworkRequest::Automatic).toInt() == QNetworkRequest::Automatic) {
QNetworkCookieJar *jar = manager->cookieJar();
if (jar) {
QList<QNetworkCookie> cookies =
qvariant_cast<QList<QNetworkCookie> >(it.value());
jar->setCookiesFromUrl(cookies, url);
}
}
}
emit q->metaDataChanged();
}

View File

@ -871,16 +871,20 @@ void QNetworkReplyImplPrivate::metaDataChanged()
Q_Q(QNetworkReplyImpl);
// 1. do we have cookies?
// 2. are we allowed to set them?
if (cookedHeaders.contains(QNetworkRequest::SetCookieHeader) && !manager.isNull()
&& (static_cast<QNetworkRequest::LoadControl>
(request.attribute(QNetworkRequest::CookieSaveControlAttribute,
QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Automatic)) {
QList<QNetworkCookie> cookies =
qvariant_cast<QList<QNetworkCookie> >(cookedHeaders.value(QNetworkRequest::SetCookieHeader));
QNetworkCookieJar *jar = manager->cookieJar();
if (jar)
jar->setCookiesFromUrl(cookies, url);
if (!manager.isNull()) {
const auto it = cookedHeaders.constFind(QNetworkRequest::SetCookieHeader);
if (it != cookedHeaders.cend()
&& request.attribute(QNetworkRequest::CookieSaveControlAttribute,
QNetworkRequest::Automatic).toInt() == QNetworkRequest::Automatic) {
QNetworkCookieJar *jar = manager->cookieJar();
if (jar) {
QList<QNetworkCookie> cookies =
qvariant_cast<QList<QNetworkCookie> >(it.value());
jar->setCookiesFromUrl(cookies, url);
}
}
}
emit q->metaDataChanged();
}

View File

@ -872,7 +872,8 @@ void QSpdyProtocolHandler::handleSYN_REPLY(char flags, quint32 /*length*/, const
void QSpdyProtocolHandler::parseHttpHeaders(char flags, const QByteArray &frameData)
{
qint32 streamID = getStreamID(frameData.constData());
if (!m_inFlightStreams.contains(streamID)) {
const auto it = m_inFlightStreams.constFind(streamID);
if (it == m_inFlightStreams.cend()) {
sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
return;
}
@ -882,7 +883,7 @@ void QSpdyProtocolHandler::parseHttpHeaders(char flags, const QByteArray &frameD
QByteArray headerValuePairs = frameData.mid(4);
HttpMessagePair pair = m_inFlightStreams.value(streamID);
HttpMessagePair pair = it.value();
QHttpNetworkReply *httpReply = pair.second;
Q_ASSERT(httpReply != 0);
@ -1152,12 +1153,13 @@ void QSpdyProtocolHandler::handleWINDOW_UPDATE(char /*flags*/, quint32 /*length*
qint32 streamID = getStreamID(frameData.constData());
qint32 deltaWindowSize = fourBytesToInt(frameData.constData() + 4);
if (!m_inFlightStreams.contains(streamID)) {
const auto it = m_inFlightStreams.constFind(streamID);
if (it == m_inFlightStreams.cend()) {
sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
return;
}
QHttpNetworkReply *reply = m_inFlightStreams.value(streamID).second;
QHttpNetworkReply *reply = it.value().second;
Q_ASSERT(reply);
QHttpNetworkReplyPrivate *replyPrivate = reply->d_func();
Q_ASSERT(replyPrivate);
@ -1176,7 +1178,8 @@ void QSpdyProtocolHandler::handleDataFrame(const QByteArray &frameHeaders)
Q_ASSERT(frameHeaders.count() >= 8);
qint32 streamID = getStreamID(frameHeaders.constData());
if (!m_inFlightStreams.contains(streamID)) {
const auto it = m_inFlightStreams.constFind(streamID);
if (it == m_inFlightStreams.cend()) {
sendRST_STREAM(streamID, RST_STREAM_INVALID_STREAM);
return;
}
@ -1198,7 +1201,7 @@ void QSpdyProtocolHandler::handleDataFrame(const QByteArray &frameHeaders)
m_waitingForCompleteStream = false;
}
HttpMessagePair pair = m_inFlightStreams.value(streamID);
HttpMessagePair pair = it.value();
QHttpNetworkRequest httpRequest = pair.first;
QHttpNetworkReply *httpReply = pair.second;
Q_ASSERT(httpReply != 0);

View File

@ -52,6 +52,8 @@
#include <QtCore/qbytearray.h>
#include <QtCore/qglobal.h>
#include <utility>
#ifndef QT_NO_BEARERMANAGEMENT
@ -263,17 +265,18 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIden
foreach (QBearerEngine *engine, sessionEngines) {
QMutexLocker locker(&engine->mutex);
if (engine->accessPointConfigurations.contains(identifier))
item.d = engine->accessPointConfigurations[identifier];
else if (engine->snapConfigurations.contains(identifier))
item.d = engine->snapConfigurations[identifier];
else if (engine->userChoiceConfigurations.contains(identifier))
item.d = engine->userChoiceConfigurations[identifier];
else
continue;
return item;
if (auto ptr = engine->accessPointConfigurations.value(identifier)) {
item.d = std::move(ptr);
break;
}
if (auto ptr = engine->snapConfigurations.value(identifier)) {
item.d = std::move(ptr);
break;
}
if (auto ptr = engine->userChoiceConfigurations.value(identifier)) {
item.d = std::move(ptr);
break;
}
}
return item;

View File

@ -65,9 +65,10 @@ static void doDeleteLater(QObject* obj)
QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(const QNetworkConfiguration &config)
{
QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
const auto it = m->sessions.constFind(config);
//if already have a session, return it
if (m->sessions.contains(config)) {
QSharedPointer<QNetworkSession> p = m->sessions.value(config).toStrongRef();
if (it != m->sessions.cend()) {
QSharedPointer<QNetworkSession> p = it.value().toStrongRef();
if (!p.isNull())
return p;
}

View File

@ -370,9 +370,11 @@ bool QSocks5BindStore::contains(qintptr socketDescriptor)
QSocks5BindData *QSocks5BindStore::retrieve(qintptr socketDescriptor)
{
QMutexLocker lock(&mutex);
if (!store.contains(socketDescriptor))
const auto it = store.constFind(socketDescriptor);
if (it == store.cend())
return 0;
QSocks5BindData *bindData = store.take(socketDescriptor);
QSocks5BindData *bindData = it.value();
store.erase(it);
if (bindData) {
if (bindData->controlSocket->thread() != QThread::currentThread()) {
qWarning("Can not access socks5 bind data from different thread");

View File

@ -482,8 +482,9 @@ QList<QSslCertificate> QSslCertificate::fromPath(const QString &path,
if (pos != -1) {
// there was a special char in the path so cut of the part containing that char.
pathPrefix = pathPrefix.left(pos);
if (pathPrefix.contains(QLatin1Char('/')))
pathPrefix = pathPrefix.left(pathPrefix.lastIndexOf(QLatin1Char('/')));
const int lastIndexOfSlash = pathPrefix.lastIndexOf(QLatin1Char('/'));
if (lastIndexOfSlash != -1)
pathPrefix = pathPrefix.left(lastIndexOfSlash);
else
pathPrefix.clear();
} else {