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>
This commit is contained in:
parent
67fec4a5f5
commit
54255f7c5e
@ -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)
|
||||
{
|
||||
|
@ -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(); }
|
||||
|
@ -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>();
|
||||
|
Loading…
x
Reference in New Issue
Block a user