From 177050862e644f9a279086b703cb04e06ea409b8 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 8 Dec 2015 14:07:12 +0100 Subject: Clean up correctly in rendercontrol to avoid crashes Not destroying the Animator controller leads to scenegraph animators running even after destroying the rendercontrol and the window. Add the missing delete call and fix the somewhat broken cleanup sequence. Task-number: QTBUG-49635 Change-Id: I170b4bb4b065bda46d8ab9ad9a3992bc8cfd1d1e Reviewed-by: Gunnar Sletta --- src/quick/items/qquickrendercontrol.cpp | 19 +++++++++++++------ src/quick/items/qquickrendercontrol_p.h | 1 - 2 files changed, 13 insertions(+), 7 deletions(-) (limited to 'src/quick/items') diff --git a/src/quick/items/qquickrendercontrol.cpp b/src/quick/items/qquickrendercontrol.cpp index cc4cec443a..d00b02c005 100644 --- a/src/quick/items/qquickrendercontrol.cpp +++ b/src/quick/items/qquickrendercontrol.cpp @@ -129,11 +129,6 @@ QQuickRenderControlPrivate::QQuickRenderControlPrivate() rc = new QSGRenderContext(sg); } -QQuickRenderControlPrivate::~QQuickRenderControlPrivate() -{ - delete rc; -} - void QQuickRenderControlPrivate::cleanup() { delete sg; @@ -162,13 +157,25 @@ QQuickRenderControl::~QQuickRenderControl() if (d->window) QQuickWindowPrivate::get(d->window)->renderControl = 0; + + // It is likely that the cleanup in windowDestroyed() is not called since + // the standard pattern is to destroy the rendercontrol before the QQuickWindow. + // Do it here. + d->windowDestroyed(); + + delete d->rc; } void QQuickRenderControlPrivate::windowDestroyed() { - if (window == 0) { + if (window) { rc->invalidate(); QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + + delete QQuickWindowPrivate::get(window)->animationController; + QQuickWindowPrivate::get(window)->animationController = 0; + + window = 0; } } diff --git a/src/quick/items/qquickrendercontrol_p.h b/src/quick/items/qquickrendercontrol_p.h index 8837ed79dc..6fe475bb93 100644 --- a/src/quick/items/qquickrendercontrol_p.h +++ b/src/quick/items/qquickrendercontrol_p.h @@ -56,7 +56,6 @@ public: Q_DECLARE_PUBLIC(QQuickRenderControl) QQuickRenderControlPrivate(); - ~QQuickRenderControlPrivate(); static QQuickRenderControlPrivate *get(QQuickRenderControl *renderControl) { return renderControl->d_func(); -- cgit v1.2.3