diff options
author | Thiago Macieira <thiago@kde.org> | 2011-07-20 16:06:58 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-07-21 08:54:00 +0200 |
commit | 6d3c0643020aaf002b985a16a66f3c289daea4f0 (patch) | |
tree | 875c76adf08242cd8ed4dd7678509b3d085dc51e /src/gui/painting/qpen.cpp | |
parent | de587d736a1fd661c3fddeebefce02e436a2c7a5 (diff) |
Get rid of the evilness of Q_GLOBAL_STATIC_WITH_INITIALIZER
That macro is a nightmare. It leads to writing code that is
thread-unsafe or other problems. So rewrite the code that used this
macro to use special-purpose classes with constructors.
This commit does not introduce new errors. The FIXME in qicon.cpp
(qtIconCache()) was a condition already present. It does fix the race
conditions that were present in qbrush.cpp nullBrushInstance() and
qfontengine.cpp qt_grayPalette().
Specialising QGlobalStatic is also evil.
Change-Id: I039311f6a5ac9ea4ad7b310b870a2adf888da7e5
Merge-request: 10
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
Reviewed-on: http://codereview.qt.nokia.com/1895
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Diffstat (limited to 'src/gui/painting/qpen.cpp')
-rw-r--r-- | src/gui/painting/qpen.cpp | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/src/gui/painting/qpen.cpp b/src/gui/painting/qpen.cpp index 7185f0d346..a79e3a0cd2 100644 --- a/src/gui/painting/qpen.cpp +++ b/src/gui/painting/qpen.cpp @@ -244,30 +244,25 @@ inline QPenPrivate::QPenPrivate(const QBrush &_brush, qreal _width, Qt::PenStyle static const Qt::PenCapStyle qpen_default_cap = Qt::SquareCap; static const Qt::PenJoinStyle qpen_default_join = Qt::BevelJoin; -#ifndef QT_NO_THREAD -// Special deleter that only deletes if the ref-count goes to zero -template <> -class QGlobalStaticDeleter<QPenPrivate> +class QPenDataHolder { public: - QGlobalStatic<QPenPrivate> &globalStatic; - QGlobalStaticDeleter(QGlobalStatic<QPenPrivate> &_globalStatic) - : globalStatic(_globalStatic) + QPenData *pen; + QPenDataHolder(const QBrush &brush, qreal width, Qt::PenStyle penStyle, + Qt::PenCapStyle penCapStyle, Qt::PenJoinStyle _joinStyle) + : pen(new QPenData(brush, width, penStyle, penCapStyle, _joinStyle)) { } - - inline ~QGlobalStaticDeleter() + ~QPenDataHolder() { - if (!globalStatic.pointer->ref.deref()) - delete globalStatic.pointer; - globalStatic.pointer = 0; - globalStatic.destroyed = true; + if (!pen->ref.deref()) + delete pen; + pen = 0; } }; -#endif -Q_GLOBAL_STATIC_WITH_ARGS(QPenData, defaultPenInstance, +Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, defaultPenInstance, (Qt::black, 0, Qt::SolidLine, qpen_default_cap, qpen_default_join)) -Q_GLOBAL_STATIC_WITH_ARGS(QPenData, nullPenInstance, +Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, nullPenInstance, (Qt::black, 0, Qt::NoPen, qpen_default_cap, qpen_default_join)) /*! @@ -276,7 +271,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QPenData, nullPenInstance, QPen::QPen() { - d = defaultPenInstance(); + d = defaultPenInstance()->pen; d->ref.ref(); } @@ -289,7 +284,7 @@ QPen::QPen() QPen::QPen(Qt::PenStyle style) { if (style == Qt::NoPen) { - d = nullPenInstance(); + d = nullPenInstance()->pen; d->ref.ref(); } else { d = new QPenData(Qt::black, 0, style, qpen_default_cap, qpen_default_join); |