aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@nokia.com>2011-05-11 07:55:56 +0200
committerGunnar Sletta <gunnar.sletta@nokia.com>2011-05-11 13:16:01 +0200
commit97e553d578f251375a3f3affc8d5bbc5068d24a1 (patch)
treeb0003770a5dba04e4587a5d1b3fcd95147e197e3 /src
parentad5aeed367849caf9506bb145e4300f3c0b23755 (diff)
Stop the render thread before deleting the QSGCanvas.
Diffstat (limited to 'src')
-rw-r--r--src/declarative/items/qsgcanvas.cpp27
-rw-r--r--src/declarative/items/qsgcanvas_p.h2
2 files changed, 20 insertions, 9 deletions
diff --git a/src/declarative/items/qsgcanvas.cpp b/src/declarative/items/qsgcanvas.cpp
index 7b7974804f..15d301a228 100644
--- a/src/declarative/items/qsgcanvas.cpp
+++ b/src/declarative/items/qsgcanvas.cpp
@@ -106,6 +106,19 @@ QSGRootItem::QSGRootItem()
{
}
+void QSGCanvasPrivate::stopRenderingThread()
+{
+ if (thread->isRunning()) {
+ mutex.lock();
+ exitThread = true;
+ wait.wakeOne();
+ wait.wait(&mutex);
+ exitThread = false;
+ mutex.unlock();
+ thread->wait();
+ }
+}
+
void QSGCanvasPrivate::_q_animationStarted()
{
#ifdef THREAD_DEBUG
@@ -239,15 +252,8 @@ void QSGCanvas::hideEvent(QHideEvent *e)
{
Q_D(QSGCanvas);
- if (d->threadedRendering) {
- d->mutex.lock();
- d->exitThread = true;
- d->wait.wakeOne();
- d->wait.wait(&d->mutex);
- d->exitThread = false;
- d->mutex.unlock();
- d->thread->wait();
- }
+ if (d->threadedRendering)
+ d->stopRenderingThread();
d->animationDriver->uninstall();
@@ -916,6 +922,9 @@ QSGCanvas::~QSGCanvas()
{
Q_D(QSGCanvas);
+ if (d->threadedRendering)
+ d->stopRenderingThread();
+
// ### should we change ~QSGItem to handle this better?
// manually cleanup for the root item (item destructor only handles these when an item is parented)
QSGItemPrivate *rootItemPrivate = QSGItemPrivate::get(d->rootItem);
diff --git a/src/declarative/items/qsgcanvas_p.h b/src/declarative/items/qsgcanvas_p.h
index c0aabaadd8..98c3d93f45 100644
--- a/src/declarative/items/qsgcanvas_p.h
+++ b/src/declarative/items/qsgcanvas_p.h
@@ -115,6 +115,8 @@ public:
void sendHoverEvent(QEvent::Type, QSGItem *, QGraphicsSceneHoverEvent *);
void clearHover();
+ void stopRenderingThread();
+
QDeclarativeGuard<QSGItem> hoverItem;
enum FocusOption {
DontChangeFocusProperty = 0x01,