diff options
author | Mika Salmela <mika.salmela@qt.io> | 2017-01-10 12:10:39 +0200 |
---|---|---|
committer | Mika Salmela <mika.salmela@qt.io> | 2017-01-12 10:18:35 +0000 |
commit | f03ed59a582d2bf689c866f195224bf659a7bc47 (patch) | |
tree | af4b81dabfa457c344703a05b620f088c9000067 /src/datavisualizationqml2 | |
parent | 54910f8cf827d6f9474de9f6f88b3a158a058c56 (diff) |
Add mutex guards for AbstractDeclarative::updateWindowParameters
Adds a mutex to guard that pointer to controller is not deleted while
doing updateWindowParameters. The render thread doesn't have control to
the node mutex, so that won't apply since it may be deleted while requesting
a mutex.
Change-Id: I8897954415c1bd7ab61ef99b420c9ac2aaa89411
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/datavisualizationqml2')
5 files changed, 12 insertions, 0 deletions
diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 220a1a0c..7568fd30 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -77,6 +77,10 @@ AbstractDeclarative::~AbstractDeclarative() disconnect(this, 0, this, 0); checkWindowList(0); + // Make sure not deleting locked mutex + QMutexLocker locker(&m_mutex); + locker.unlock(); + m_nodeMutex.clear(); } @@ -518,6 +522,8 @@ void AbstractDeclarative::itemChange(ItemChange change, const ItemChangeData & v void AbstractDeclarative::updateWindowParameters() { + const QMutexLocker locker(&m_mutex); + // Update the device pixel ratio, window size and bounding box QQuickWindow *win = window(); if (win && !m_controller.isNull()) { diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index ebdf7609..1a9c4e81 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -235,6 +235,8 @@ public: void setMargin(qreal margin); qreal margin() const; + QMutex *mutex() { return &m_mutex; } + public Q_SLOTS: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0; @@ -302,6 +304,7 @@ private: QThread *m_mainThread; QThread *m_contextThread; bool m_runningInDesigner; + QMutex m_mutex; }; Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDeclarative::SelectionFlags) Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDeclarative::OptimizationHints) diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index 2e3964f9..ca1d3f60 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -51,6 +51,7 @@ DeclarativeBars::DeclarativeBars(QQuickItem *parent) DeclarativeBars::~DeclarativeBars() { QMutexLocker locker(m_nodeMutex.data()); + const QMutexLocker locker2(mutex()); delete m_barsController; } diff --git a/src/datavisualizationqml2/declarativescatter.cpp b/src/datavisualizationqml2/declarativescatter.cpp index 0b7efdb4..29e56a79 100644 --- a/src/datavisualizationqml2/declarativescatter.cpp +++ b/src/datavisualizationqml2/declarativescatter.cpp @@ -49,6 +49,7 @@ DeclarativeScatter::DeclarativeScatter(QQuickItem *parent) DeclarativeScatter::~DeclarativeScatter() { QMutexLocker locker(m_nodeMutex.data()); + const QMutexLocker locker2(mutex()); delete m_scatterController; } diff --git a/src/datavisualizationqml2/declarativesurface.cpp b/src/datavisualizationqml2/declarativesurface.cpp index 4bfa7873..2e210246 100644 --- a/src/datavisualizationqml2/declarativesurface.cpp +++ b/src/datavisualizationqml2/declarativesurface.cpp @@ -51,6 +51,7 @@ DeclarativeSurface::DeclarativeSurface(QQuickItem *parent) DeclarativeSurface::~DeclarativeSurface() { QMutexLocker locker(m_nodeMutex.data()); + const QMutexLocker locker2(mutex()); delete m_surfaceController; } |