From b1cbc1289ffd36c6ac30b049b8f5f8730ee4889d Mon Sep 17 00:00:00 2001 From: Louai Al-Khanji Date: Thu, 2 Oct 2014 09:19:12 +0300 Subject: [PATCH] EGLFS: Fix plugin destruction (again) The previous patch was flawed since by the time the QEglPlatformIntegration destructor was called the virtual function table did not point to the methods in QEglFsPlatformIntegration any more. Change-Id: I310e5e3e734a22b44645ba912b579f193bcfae86 Reviewed-by: Laszlo Agocs --- src/gui/kernel/qguiapplication.cpp | 2 ++ src/gui/kernel/qplatformintegration.cpp | 10 ++++++++++ src/gui/kernel/qplatformintegration.h | 1 + .../eglconvenience/qeglplatformintegration.cpp | 14 ++++++-------- .../eglconvenience/qeglplatformintegration_p.h | 2 +- src/plugins/platforms/eglfs/qeglfsintegration.cpp | 1 + 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 79dd7ea934..520330abc1 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1391,6 +1391,8 @@ QGuiApplicationPrivate::~QGuiApplicationPrivate() } #endif + platform_integration->destroy(); + delete platform_theme; platform_theme = 0; delete platform_integration; diff --git a/src/gui/kernel/qplatformintegration.cpp b/src/gui/kernel/qplatformintegration.cpp index 39b031ef6d..7e291e9050 100644 --- a/src/gui/kernel/qplatformintegration.cpp +++ b/src/gui/kernel/qplatformintegration.cpp @@ -323,6 +323,16 @@ void QPlatformIntegration::initialize() { } +/*! + Called before the platform integration is deleted. Useful when cleanup relies on virtual + functions. + + \since 5.5 +*/ +void QPlatformIntegration::destroy() +{ +} + /*! Returns the platforms input context. diff --git a/src/gui/kernel/qplatformintegration.h b/src/gui/kernel/qplatformintegration.h index d510240fa4..ccbe4cc73d 100644 --- a/src/gui/kernel/qplatformintegration.h +++ b/src/gui/kernel/qplatformintegration.h @@ -109,6 +109,7 @@ public: // Event dispatcher: virtual QAbstractEventDispatcher *createEventDispatcher() const = 0; virtual void initialize(); + virtual void destroy(); //Deeper window system integrations virtual QPlatformFontDatabase *fontDatabase() const; diff --git a/src/platformsupport/eglconvenience/qeglplatformintegration.cpp b/src/platformsupport/eglconvenience/qeglplatformintegration.cpp index a6207cf402..10913ef094 100644 --- a/src/platformsupport/eglconvenience/qeglplatformintegration.cpp +++ b/src/platformsupport/eglconvenience/qeglplatformintegration.cpp @@ -95,15 +95,7 @@ QEGLPlatformIntegration::QEGLPlatformIntegration() QEGLPlatformIntegration::~QEGLPlatformIntegration() { - foreach (QWindow *w, qGuiApp->topLevelWindows()) - w->destroy(); - delete m_screen; - - if (m_display != EGL_NO_DISPLAY) - eglTerminate(m_display); - - destroy(); } void QEGLPlatformIntegration::initialize() @@ -126,7 +118,13 @@ void QEGLPlatformIntegration::initialize() void QEGLPlatformIntegration::destroy() { + foreach (QWindow *w, qGuiApp->topLevelWindows()) + w->destroy(); + delete m_screen; + + if (m_display != EGL_NO_DISPLAY) + eglTerminate(m_display); } QAbstractEventDispatcher *QEGLPlatformIntegration::createEventDispatcher() const diff --git a/src/platformsupport/eglconvenience/qeglplatformintegration_p.h b/src/platformsupport/eglconvenience/qeglplatformintegration_p.h index 11977db78b..2080ff0352 100644 --- a/src/platformsupport/eglconvenience/qeglplatformintegration_p.h +++ b/src/platformsupport/eglconvenience/qeglplatformintegration_p.h @@ -65,7 +65,7 @@ public: ~QEGLPlatformIntegration(); void initialize() Q_DECL_OVERRIDE; - virtual void destroy(); + void destroy() Q_DECL_OVERRIDE; QEGLPlatformScreen *screen() const { return m_screen; } EGLDisplay display() const { return m_display; } diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp index 16d8c50291..6fe3893922 100644 --- a/src/plugins/platforms/eglfs/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp @@ -88,6 +88,7 @@ void QEglFSIntegration::initialize() void QEglFSIntegration::destroy() { + QEGLPlatformIntegration::destroy(); QEglFSHooks::hooks()->platformDestroy(); }