summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBradley T. Hughes <bradley.hughes@nokia.com>2011-09-09 11:07:48 +0200
committerQt by Nokia <qt-info@nokia.com>2011-09-26 16:05:36 +0200
commit54255f7c5e7cecc58076c412183ce2d877a34c18 (patch)
tree29cddf2af89a144f794c86cb24cb1d5eb0db1de1
parent67fec4a5f5f164a24481921eab57955ce0d607f0 (diff)
Make QVectorData::shared_null const
Similar to QByteArray and QString, keep the shared_null in shareable memory and never modify it. Since QRegion uses the internals of QVector, we need to make sure that QRegion also never modifies the shared_null. Change-Id: I809e5873fe414138f97d501e05458b73c04b18fb Reviewed-on: http://codereview.qt-project.org/4529 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
-rw-r--r--src/corelib/tools/qvector.cpp2
-rw-r--r--src/corelib/tools/qvector.h10
-rw-r--r--src/gui/painting/qregion.cpp3
3 files changed, 8 insertions, 7 deletions
diff --git a/src/corelib/tools/qvector.cpp b/src/corelib/tools/qvector.cpp
index 98a2412347..e1828c2b0f 100644
--- a/src/corelib/tools/qvector.cpp
+++ b/src/corelib/tools/qvector.cpp
@@ -52,7 +52,7 @@ static inline int alignmentThreshold()
return 2 * sizeof(void*);
}
-QVectorData QVectorData::shared_null = { Q_BASIC_ATOMIC_INITIALIZER(1), 0, 0, true, false, 0 };
+const QVectorData QVectorData::shared_null = { Q_REFCOUNT_INITIALIZER(-1), 0, 0, true, false, 0 };
QVectorData *QVectorData::malloc(int sizeofTypedData, int size, int sizeofT, QVectorData *init)
{
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index 5c25266ede..34d1ed3717 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -42,10 +42,10 @@
#ifndef QVECTOR_H
#define QVECTOR_H
-#include <QtCore/qiterator.h>
-#include <QtCore/qatomic.h>
#include <QtCore/qalgorithms.h>
+#include <QtCore/qiterator.h>
#include <QtCore/qlist.h>
+#include <QtCore/qrefcount.h>
#ifndef QT_NO_STL
#include <iterator>
@@ -65,7 +65,7 @@ QT_MODULE(Core)
struct Q_CORE_EXPORT QVectorData
{
- QBasicAtomicInt ref;
+ QtPrivate::RefCount ref;
int alloc;
int size;
#if defined(QT_ARCH_SPARC) && defined(Q_CC_GNU) && defined(__LP64__) && defined(QT_BOOTSTRAPPED)
@@ -79,7 +79,7 @@ struct Q_CORE_EXPORT QVectorData
uint reserved : 30;
#endif
- static QVectorData shared_null;
+ static const QVectorData shared_null;
// ### Qt 5: rename to 'allocate()'. The current name causes problems for
// some debugges when the QVector is member of a class within an unnamed namespace.
// ### Qt 5: can be removed completely. (Ralf)
@@ -117,7 +117,7 @@ class QVector
public:
// ### Qt 5: Consider making QVector non-shared to get at least one
// "really fast" container. See tests/benchmarks/corelib/tools/qvector/
- inline QVector() : d(&QVectorData::shared_null) { d->ref.ref(); }
+ inline QVector() : d(const_cast<QVectorData *>(&QVectorData::shared_null)) { }
explicit QVector(int size);
QVector(int size, const T &t);
inline QVector(const QVector<T> &v) : d(v.d) { d->ref.ref(); if (!d->sharable) detach_helper(); }
diff --git a/src/gui/painting/qregion.cpp b/src/gui/painting/qregion.cpp
index d3a43c4193..f343fa9b4c 100644
--- a/src/gui/painting/qregion.cpp
+++ b/src/gui/painting/qregion.cpp
@@ -4268,7 +4268,8 @@ QVector<QRect> QRegion::rects() const
if (d->qt_rgn) {
d->qt_rgn->vectorize();
// hw: modify the vector size directly to avoid reallocation
- d->qt_rgn->rects.d->size = d->qt_rgn->numRects;
+ if (d->qt_rgn->rects.d != &QVectorData::shared_null)
+ d->qt_rgn->rects.d->size = d->qt_rgn->numRects;
return d->qt_rgn->rects;
} else {
return QVector<QRect>();