summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLudger Krämer <kraemer@dem-gmbh.de>2014-09-17 10:39:44 +0200
committerLudger Krämer <kraemer@dem-gmbh.de>2015-03-31 06:24:07 +0000
commit9ea80826581b3ce8081567823e2377b8590917b8 (patch)
treec6fa546a30c9b001a373f18f80a83dc33cf2e6f0 /src
parent7baaec17edb06634f1d6235a55c7adbd112cba3e (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.mm13
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;
}