summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2010-02-18 21:29:52 (GMT)
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2010-02-22 17:12:16 (GMT)
commite38f2b026a00acafab96b1fcc7c27a4446ec49d1 (patch)
treec8f20dbeec8e089f86a3b67f16e116e23d43c55f
parent4967231a9e5c39de3a60b61db9b6a71266a04829 (diff)
downloadQt-e38f2b026a00acafab96b1fcc7c27a4446ec49d1.zip
Qt-e38f2b026a00acafab96b1fcc7c27a4446ec49d1.tar.gz
Qt-e38f2b026a00acafab96b1fcc7c27a4446ec49d1.tar.bz2
make queues to which only lists are appended not blow the memory
append2(list) didn't use the array shifting logic the append() for single elements does. this would cause the list to grow endlessly despite leading elements being removed if only lists were ever appended. Reviewed-by: joao
-rw-r--r--src/corelib/tools/qlist.cpp36
-rw-r--r--src/corelib/tools/qlist.h1
2 files changed, 19 insertions, 18 deletions
diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp
index 39c1beb..249b8d1 100644
--- a/src/corelib/tools/qlist.cpp
+++ b/src/corelib/tools/qlist.cpp
@@ -180,22 +180,30 @@ void QListData::realloc(int alloc)
d->begin = d->end = 0;
}
-// ensures that enough space is available to append one element
-void **QListData::append()
+// ensures that enough space is available to append n elements
+void **QListData::append(int n)
{
Q_ASSERT(d->ref == 1);
- if (d->end == d->alloc) {
- int n = d->end - d->begin;
- if (d->begin > 2 * d->alloc / 3) {
+ int e = d->end;
+ if (e + n > d->alloc) {
+ int b = d->begin;
+ if (b - n >= 2 * d->alloc / 3) {
// we have enough space. Just not at the end -> move it.
- ::memcpy(d->array, d->array + d->begin, n * sizeof(void *));
+ e -= b;
+ ::memcpy(d->array, d->array + b, e * sizeof(void *));
d->begin = 0;
- d->end = n;
} else {
- realloc(grow(d->alloc + 1));
+ realloc(grow(d->alloc + n));
}
}
- return d->array + d->end++;
+ d->end = e + n;
+ return d->array + e;
+}
+
+// ensures that enough space is available to append one element
+void **QListData::append()
+{
+ return append(1);
}
// ensures that enough space is available to append the list
@@ -219,15 +227,7 @@ void **QListData::append(const QListData& l)
// ensures that enough space is available to append the list
void **QListData::append2(const QListData& l)
{
- Q_ASSERT(d->ref == 1);
- int e = d->end;
- int n = l.d->end - l.d->begin;
- if (n) {
- if (e + n > d->alloc)
- realloc(grow(e + n));
- d->end += n;
- }
- return d->array + e;
+ return append(l.d->end - l.d->begin);
}
void **QListData::prepend()
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 5364e8e..fdebd7d 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -80,6 +80,7 @@ struct Q_CORE_EXPORT QListData {
static Data shared_null;
Data *d;
void **erase(void **xi);
+ void **append(int n);
void **append();
void **append(const QListData &l);
void **append2(const QListData &l); // remove in 5.0