diff options
author | Ludger Krämer <kraemer@dem-gmbh.de> | 2014-09-17 10:39:44 +0200 |
---|---|---|
committer | Ludger Krämer <kraemer@dem-gmbh.de> | 2015-03-31 06:24:07 +0000 |
commit | 9ea80826581b3ce8081567823e2377b8590917b8 (patch) | |
tree | c6fa546a30c9b001a373f18f80a83dc33cf2e6f0 /src | |
parent | 7baaec17edb06634f1d6235a55c7adbd112cba3e (diff) |
fix high memory usage on large download
previously the whole response was cached in a NSMutableData which leads
to high memory usage on large responses (e.g. downloading a large file).
With this patch only the part of the answer that has not yet been read
by the caller is cached.
Task-number: QTBUG-41356
Change-Id: Ic2fe822552620d8835a2c81f8c76dd170fe6ec97
Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/network/access/qnetworkreplynsurlconnectionimpl.mm | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/network/access/qnetworkreplynsurlconnectionimpl.mm b/src/network/access/qnetworkreplynsurlconnectionimpl.mm index 327dbd4ea7..6ed209dff7 100644 --- a/src/network/access/qnetworkreplynsurlconnectionimpl.mm +++ b/src/network/access/qnetworkreplynsurlconnectionimpl.mm @@ -295,7 +295,7 @@ void QNetworkReplyNSURLConnectionImpl::readyReadOutgoingData() if ([response expectedContentLength] != NSURLResponseUnknownLength) { QMetaObject::invokeMethod(replyprivate->q_func(), "downloadProgress", Qt::QueuedConnection, - Q_ARG(qint64, qint64([responseData length])), + Q_ARG(qint64, qint64([responseData length] + replyprivate->bytesRead)), Q_ARG(qint64, qint64([response expectedContentLength]))); } @@ -426,9 +426,7 @@ qint64 QNetworkReplyNSURLConnectionImpl::bytesAvailable() const { Q_D(const QNetworkReplyNSURLConnectionImpl); qint64 available = QNetworkReply::bytesAvailable() + - [[d->urlConnectionDelegate responseData] length] - - d->bytesRead; - + [[d->urlConnectionDelegate responseData] length]; return available; } @@ -440,7 +438,7 @@ bool QNetworkReplyNSURLConnectionImpl::isSequential() const qint64 QNetworkReplyNSURLConnectionImpl::size() const { Q_D(const QNetworkReplyNSURLConnectionImpl); - return [[d->urlConnectionDelegate responseData] length]; + return [[d->urlConnectionDelegate responseData] length] + d->bytesRead; } /*! @@ -450,9 +448,10 @@ qint64 QNetworkReplyNSURLConnectionImpl::readData(char *data, qint64 maxlen) { Q_D(QNetworkReplyNSURLConnectionImpl); qint64 dataSize = [[d->urlConnectionDelegate responseData] length]; - qint64 canRead = qMin(maxlen, dataSize - d->bytesRead); + qint64 canRead = qMin(maxlen, dataSize); const char *sourceBase = static_cast<const char *>([[d->urlConnectionDelegate responseData] bytes]); - memcpy(data, sourceBase + d->bytesRead, canRead); + memcpy(data, sourceBase, canRead); + [[d->urlConnectionDelegate responseData] replaceBytesInRange:NSMakeRange(0, canRead) withBytes:NULL length:0]; d->bytesRead += canRead; return canRead; } |