summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Petersson <Martin.Petersson@nokia.com>2012-06-11 15:35:04 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-26 11:32:39 +0200
commita9c398096bcb342e7d7b1cec6137b0ee8d05872e (patch)
treeb993d2e94d1db0acfd521913d1c9af00ac292a65 /src
parent1ce203d05a952f039105d30968daf2eacae66be8 (diff)
QIODevice: free memory when buffer is cleared
The QIODevicePrivateLinearBuffer does not deallocate any data on readAll or clear. This fix will change the buffer so that data is deallocated on clear, readAll and when read emptied the buffer. This is needed for QAbstractSockets that don't have readBufferMaxSize set, as the buffer will grow but never decrease in size when you read from it. Change-Id: Iab42e40182f9ebe0739c99b2d1e820ce287dc931 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/io/qiodevice.cpp4
-rw-r--r--src/corelib/io/qiodevice_p.h10
2 files changed, 9 insertions, 5 deletions
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index a60aee1ebe..07634c3ca2 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -789,8 +789,10 @@ qint64 QIODevice::read(char *data, qint64 maxSize)
readSoFar += lastReadChunkSize;
// fast exit when satisfied by buffer
if (lastReadChunkSize == maxSize && !(d->openMode & Text)) {
- if (d->buffer.isEmpty())
+ if (d->buffer.isEmpty()) {
+ d->buffer.clear();
readData(data, 0);
+ }
return readSoFar;
}
diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h
index 4819ec11a0..362ea4bdf0 100644
--- a/src/corelib/io/qiodevice_p.h
+++ b/src/corelib/io/qiodevice_p.h
@@ -78,8 +78,11 @@ public:
delete [] buf;
}
void clear() {
- first = buf;
len = 0;
+ delete [] buf;
+ buf = 0;
+ first = buf;
+ capacity = 0;
}
int size() const {
return len;
@@ -129,10 +132,9 @@ public:
}
}
QByteArray readAll() {
- char* f = first;
- int l = len;
+ QByteArray retVal(first, len);
clear();
- return QByteArray(f, l);
+ return retVal;
}
int readLine(char* target, int size) {
int r = qMin(size, len);