diff options
author | Alex Montgomery <apmontgomery@gmail.com> | 2013-12-18 15:25:36 -0800 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-28 22:43:38 +0100 |
commit | e13547c595913c58e6bd6a5ed80fdc729fae7d47 (patch) | |
tree | c2b7432be8825c9588e3ce4233269daed0e80076 /src/quick | |
parent | a1b6db4765d89b0081788e98dcdfdba5ed7fa121 (diff) |
Fix leak-on-exit of QSGRenderLoop::s_instance
s_instance is created with new and never deleted which causes several
destructors to never be called.
Task-number: QTBUG-35731
Change-Id: Icccb19186958f8bb74c5fd2b4b41165255debc46
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 21 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop_p.h | 3 |
2 files changed, 11 insertions, 13 deletions
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index ac1bdb7841..219f877bec 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -45,6 +45,7 @@ #include <QtCore/QCoreApplication> #include <QtCore/QTime> +#include <QtCore/QScopedPointer> #include <QtCore/private/qabstractanimation_p.h> #include <QtGui/QOpenGLContext> @@ -76,7 +77,7 @@ extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_ DEFINE_BOOL_CONFIG_OPTION(qmlNoThreadedRenderer, QML_BAD_GUI_RENDER_LOOP); DEFINE_BOOL_CONFIG_OPTION(qmlForceThreadedRenderer, QML_FORCE_THREADED_RENDERER); // Might trigger graphics driver threading bugs, use at own risk -QSGRenderLoop *QSGRenderLoop::s_instance = 0; +Q_GLOBAL_STATIC(QScopedPointer<QSGRenderLoop>, s_renderLoopInstance); QSGRenderLoop::~QSGRenderLoop() { @@ -142,8 +143,8 @@ bool QSGRenderLoop::useConsistentTiming() QSGRenderLoop *QSGRenderLoop::instance() { - if (!s_instance) { - s_instance = QSGContext::createWindowManager(); + if (s_renderLoopInstance->isNull()) { + s_renderLoopInstance->reset(QSGContext::createWindowManager()); bool info = qEnvironmentVariableIsSet("QSG_INFO"); @@ -153,7 +154,7 @@ QSGRenderLoop *QSGRenderLoop::instance() qDebug() << "QSG: using fixed animation steps"; } - if (!s_instance) { + if (s_renderLoopInstance->isNull()) { enum RenderLoopType { BasicRenderLoop, @@ -185,26 +186,26 @@ QSGRenderLoop *QSGRenderLoop::instance() switch (loopType) { case ThreadedRenderLoop: if (info) qDebug() << "QSG: threaded render loop"; - s_instance = new QSGThreadedRenderLoop(); + s_renderLoopInstance->reset(new QSGThreadedRenderLoop()); break; case WindowsRenderLoop: if (info) qDebug() << "QSG: windows render loop"; - s_instance = new QSGWindowsRenderLoop(); + s_renderLoopInstance->reset(new QSGWindowsRenderLoop()); break; default: if (info) qDebug() << "QSG: basic render loop"; - s_instance = new QSGGuiThreadRenderLoop(); + s_renderLoopInstance->reset(new QSGGuiThreadRenderLoop()); break; } } } - return s_instance; + return s_renderLoopInstance->data(); } void QSGRenderLoop::setInstance(QSGRenderLoop *instance) { - Q_ASSERT(!s_instance); - s_instance = instance; + Q_ASSERT(!s_renderLoopInstance); + s_renderLoopInstance->reset(instance); } QSGGuiThreadRenderLoop::QSGGuiThreadRenderLoop() diff --git a/src/quick/scenegraph/qsgrenderloop_p.h b/src/quick/scenegraph/qsgrenderloop_p.h index 72bad16c63..46edd77eda 100644 --- a/src/quick/scenegraph/qsgrenderloop_p.h +++ b/src/quick/scenegraph/qsgrenderloop_p.h @@ -88,9 +88,6 @@ public: Q_SIGNALS: void timeToIncubate(); - -private: - static QSGRenderLoop *s_instance; }; QT_END_NAMESPACE |