Fix possible crash in QSGContext::invalidate()
authorYoann Lopes <yoann.lopes@nokia.com>
Mon, 19 Mar 2012 13:55:12 +0000 (14:55 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 19 Mar 2012 16:08:42 +0000 (17:08 +0100)
In some cases QSGContext::invalidate() was called without any current
GL context when the render thread was terminated.

Change-Id: Ia5295c89fe13f2473115c736e328e386d6d4d183
Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
src/quick/items/qquickwindowmanager.cpp

index 64eb2bf..61c2ef2 100644 (file)
@@ -228,7 +228,7 @@ public slots:
 private:
     void handleAddedWindows();
     void handleAddedWindow(QQuickCanvas *canvas);
-    void handleRemovedWindows();
+    void handleRemovedWindows(bool clearGLContext = true);
 
     QSGContext *sg;
     QOpenGLContext *gl;
@@ -475,7 +475,7 @@ void QQuickRenderThreadSingleContextWindowManager::hide(QQuickCanvas *canvas)
 /*!
     Called on Render Thread
  */
-void QQuickRenderThreadSingleContextWindowManager::handleRemovedWindows()
+void QQuickRenderThreadSingleContextWindowManager::handleRemovedWindows(bool clearGLContext)
 {
 #ifdef THREAD_DEBUG
     printf("                RenderThread: about to remove %d\n", m_removed_windows.size());
@@ -496,7 +496,7 @@ void QQuickRenderThreadSingleContextWindowManager::handleRemovedWindows()
     // If a window is removed because it has been hidden it will take with it
     // the gl context (at least on Mac) if bound, so disconnect the gl context
     // from anything
-    if (removedAnything)
+    if (removedAnything && clearGLContext)
         gl->doneCurrent();
 }
 
@@ -755,7 +755,7 @@ void QQuickRenderThreadSingleContextWindowManager::run()
 #endif
 
     m_removed_windows << m_rendered_windows.keys();
-    handleRemovedWindows();
+    handleRemovedWindows(false);
 
     sg->invalidate();