aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Montgomery <apmontgomery@gmail.com>2013-12-18 15:25:36 -0800
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-28 22:43:38 +0100
commite13547c595913c58e6bd6a5ed80fdc729fae7d47 (patch)
treec2b7432be8825c9588e3ce4233269daed0e80076 /src
parenta1b6db4765d89b0081788e98dcdfdba5ed7fa121 (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')
-rw-r--r--src/quick/scenegraph/qsgrenderloop.cpp21
-rw-r--r--src/quick/scenegraph/qsgrenderloop_p.h3
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