From f03ed59a582d2bf689c866f195224bf659a7bc47 Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Tue, 10 Jan 2017 12:10:39 +0200 Subject: Add mutex guards for AbstractDeclarative::updateWindowParameters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Tomi Korpipää --- src/datavisualizationqml2/abstractdeclarative.cpp | 6 ++++++ src/datavisualizationqml2/abstractdeclarative_p.h | 3 +++ src/datavisualizationqml2/declarativebars.cpp | 1 + src/datavisualizationqml2/declarativescatter.cpp | 1 + src/datavisualizationqml2/declarativesurface.cpp | 1 + 5 files changed, 12 insertions(+) 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; } -- cgit v1.2.3