summaryrefslogtreecommitdiffstats
path: root/src/datavisualizationqml2
diff options
context:
space:
mode:
authorMika Salmela <mika.salmela@qt.io>2017-01-10 12:10:39 +0200
committerMika Salmela <mika.salmela@qt.io>2017-01-12 10:18:35 +0000
commitf03ed59a582d2bf689c866f195224bf659a7bc47 (patch)
treeaf4b81dabfa457c344703a05b620f088c9000067 /src/datavisualizationqml2
parent54910f8cf827d6f9474de9f6f88b3a158a058c56 (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')
-rw-r--r--src/datavisualizationqml2/abstractdeclarative.cpp6
-rw-r--r--src/datavisualizationqml2/abstractdeclarative_p.h3
-rw-r--r--src/datavisualizationqml2/declarativebars.cpp1
-rw-r--r--src/datavisualizationqml2/declarativescatter.cpp1
-rw-r--r--src/datavisualizationqml2/declarativesurface.cpp1
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;
}